UAssembly 읽기
입문
VRCHAT에서 노드를 구성해 지미크의 Udon을 제작할 수 있는 오픈 알파 버전을 공개했다.
https://twitter.com/VRDesignGuy/status/1207911393011191811
현재 자신의 언어를 사용하고 있으며, 그 규격은 이곳에서 공개된다.
https://ask.vrchat.com/t/getting-started-with-udon-assembly/84
교과서에 소개된 노드를 쫓아가면서 읽다.
마음에 드는 점이 있으면 댓글로 남겨주세요.
뭐가 우돈이야?
이것은 프로그래밍 언어로 프로그래밍 없이 노드를 구성하여 VRChat에서 대상을 조작할 수 있다.
https://ask.vrchat.com/t/getting-started-with-udon/80
노드의 구성 요소를 UAssembly라는 코드로 컴파일합니다
그것은 바이트 코드로 조립되어 UdonVM에서 실행되는 것 같다.
Udon Behaviour의 CompiledGraph Assembly를 열면 Assembly Code를 볼 수 있습니다.
참고로 이 UAssembly는 실행할 때 (재생성 단추를 눌렀을 때) 실행하기 전에 업데이트됩니다.
UAsembly 읽기
Udon의 강좌는 여기서 공개됩니다.
https://ask.vrchat.com/t/spinning-cube-example-series/81
이 중 Video 4 - Program Variables 생성된 노드에서 생성된 UAssembly의 내용을 보십시오.
이 강좌에서
두 큐브에는 Udon Behaivor와 노드가 있습니다.
한 큐브(Signal_Cube)가 설정한 회전 속도(speed)를 다른 큐브(Rotating_Cube)에 전달합니다.
Rotating_큐브를 회전하고 있습니다.
Signal_Cube
Signal_큐브의 노드가 이거야.
실행할 때 speed 값을 가져와 speedProgram에 설정합니다.
스피드는public이기 때문에 다른 노드에서 인용할 수도 있습니다.
그리고 이것이 바로 당시의 UAssembly였다..data_start
.export speed
instance_0: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
value_0: %SystemObject, null
speed: %SystemSingle, null
.data_end
.code_start
.export _start
_start:
PUSH, speed
PUSH, value_0
COPY
PUSH, instance_0
PUSH, name_0
PUSH, value_0
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
JUMP, 0xFFFFFF
.code_end
그것은 데이터 블록과 코드 블록으로 나뉜다.
블록
.data_start에서.data_end 이전에 데이터 블록에 변수 등을 정의합니다..data_start
.export speed
instance_0: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
value_0: %SystemObject, null
speed: %SystemSingle, null
.data_end
각 변수
유형 이름: 유형의 종류, 초기 값
의 작법.
예를 들어, instance_0은 UdonBehaivor에 가입한 유형으로 자신에 가입했습니다.
또한speed는 Single형으로 초기값이 없는 것 같습니다.
또한name을speed로 하기 때문에public에서 선택한 Float 노드를 놓았습니다.export speed
사용자 정의 모양새를 정의합니다.
이렇게 하면 퍼블릭 처리가 되고 다른 코드에서 이 값을 인용할 수 있다.
코드 블록
.code_start에서.code_end까지 코드 블록으로 실제 이동 부분이 적혀 있습니다..code_start
.export _start
_start:
PUSH, speed
PUSH, value_0
COPY
PUSH, instance_0
PUSH, name_0
PUSH, value_0
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
JUMP, 0xFFFFFF
.code_end
주요한 처리는 사전에 준비한 함수에 대한 것이다.
Unity에서 실행 시기를 결정할 수 있습니다.
예를 들어, 시작할 때 한 번만 각 프레임이 업데이트됩니다.
시작 노드_start:
가 추가되었습니다.
UAssembly는 블록을 들여쓰기(들여쓰기)로 결정하는 것 같아요.
_start: 시작할 때 한 번만 축소 범위를 실행합니다.
구성 요소가push 다른 함수에서 함수를 읽는 데 필요한 값을 실행하고 있습니다.
UAssembly에서도 그랬어요.COPY
특정 변수의 값을 특정 변수로 복사합니다.
여기서 미리PUSH, speed
PUSH, value_0
통하다
speed 참조 값을value_0으로 복사하는 것 같습니다.
호출 함수 부분EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
태그 요소의 표시 속성을 수정합니다.
이 함수는 VrCUdon Commoninterfaces IUdon EventReceiver입니다.Set Program Variable이라는 이름으로.
SystemString 및 SystemObject의 데이터를 수신하고 SystemVoid (즉, 데이터를 반환하지 않음) 로 돌아갑니다.
따라서 실행하기 전에 필요한 데이터PUSH, name_0
PUSH, value_0
너한테 맡긴 것 같아.
그리고 모든 것이 끝났다JUMP, 0xFFFFFF
.
이것은 그것이 메모리의 마지막 부분까지 날아가면 끝난다는 것을 나타낸다.
Rotating_Cube
실제 회전하는 노드와 UAssembly.
.data_start
.export signal
instance_0: %UnityEngineTransform, this
axis_0: %UnityEngineVector3, null
angle_0: %SystemSingle, null
Single_0: %SystemSingle, null
Single_1: %SystemSingle, null
instance_1: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
signal: %VRCUdonUdonBehaviour, this
.data_end
.code_start
.export _update
_update:
PUSH, Single_0
EXTERN, "UnityEngineTime.__get_deltaTime__SystemSingle"
PUSH, signal
PUSH, instance_1
COPY
PUSH, instance_1
PUSH, name_0
PUSH, Single_1
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__GetProgramVariable__SystemString__SystemObject"
PUSH, Single_0
PUSH, Single_1
PUSH, angle_0
EXTERN, "SystemSingle.__op_Multiplication__SystemSingle_SystemSingle__SystemSingle"
PUSH, instance_0
PUSH, axis_0
PUSH, angle_0
EXTERN, "UnityEngineTransform.__Rotate__UnityEngineVector3_SystemSingle__SystemVoid"
JUMP, 0xFFFFFF
.code_end
쓰기 방법이 같기 때문에 Signal_나는 큐브의 해설 부분을 보면 대체로 무엇을 하고 있는지 알 수 있다고 생각한다.
이번에 업데이트 노드_update:
를 넣었기 때문이다.
또한 방금 VRCUdonCommonInterfacesIUdonEventReceiver.SetProgramVariable
에서 반환 값은 Void (없음) 입니다.EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__GetProgramVariable__SystemString__SystemObject"
그러면 반환값이 System Object이기 때문에.
그것을 받아들이기 위해 사전에 파라미터를 덧붙인 것PUSH, name_0
또한 반환 값 PUSH, Single_1
을 수신하는 데도 사용됩니다.
따라서 반환 값은 Single_1이 들어가니까 다음.EXTERN, "UnityEngineTransform.__Rotate__UnityEngineVector3_SystemSingle__SystemVoid"
의 명세란 스타일에 정의된 설정입니다.
마지막
확장된 언어도 만들 수 있을 것 같아.
흥미가 있는 사람은 편지에 동봉한다
UdonAssemblyProgramAsset.cs를 UdonGraphProgramAsset으로 설정합니다.cs 열기
보니까 좋은 것 같아.
Reference
이 문제에 관하여(UAssembly 읽기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gatosyocora/items/90722a33e9528b432fa1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이것은 프로그래밍 언어로 프로그래밍 없이 노드를 구성하여 VRChat에서 대상을 조작할 수 있다.
https://ask.vrchat.com/t/getting-started-with-udon/80
노드의 구성 요소를 UAssembly라는 코드로 컴파일합니다
그것은 바이트 코드로 조립되어 UdonVM에서 실행되는 것 같다.
Udon Behaviour의 CompiledGraph Assembly를 열면 Assembly Code를 볼 수 있습니다.
참고로 이 UAssembly는 실행할 때 (재생성 단추를 눌렀을 때) 실행하기 전에 업데이트됩니다.
UAsembly 읽기
Udon의 강좌는 여기서 공개됩니다.
https://ask.vrchat.com/t/spinning-cube-example-series/81
이 중 Video 4 - Program Variables 생성된 노드에서 생성된 UAssembly의 내용을 보십시오.
이 강좌에서
두 큐브에는 Udon Behaivor와 노드가 있습니다.
한 큐브(Signal_Cube)가 설정한 회전 속도(speed)를 다른 큐브(Rotating_Cube)에 전달합니다.
Rotating_큐브를 회전하고 있습니다.
Signal_Cube
Signal_큐브의 노드가 이거야.
실행할 때 speed 값을 가져와 speedProgram에 설정합니다.
스피드는public이기 때문에 다른 노드에서 인용할 수도 있습니다.
그리고 이것이 바로 당시의 UAssembly였다..data_start
.export speed
instance_0: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
value_0: %SystemObject, null
speed: %SystemSingle, null
.data_end
.code_start
.export _start
_start:
PUSH, speed
PUSH, value_0
COPY
PUSH, instance_0
PUSH, name_0
PUSH, value_0
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
JUMP, 0xFFFFFF
.code_end
그것은 데이터 블록과 코드 블록으로 나뉜다.
블록
.data_start에서.data_end 이전에 데이터 블록에 변수 등을 정의합니다..data_start
.export speed
instance_0: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
value_0: %SystemObject, null
speed: %SystemSingle, null
.data_end
각 변수
유형 이름: 유형의 종류, 초기 값
의 작법.
예를 들어, instance_0은 UdonBehaivor에 가입한 유형으로 자신에 가입했습니다.
또한speed는 Single형으로 초기값이 없는 것 같습니다.
또한name을speed로 하기 때문에public에서 선택한 Float 노드를 놓았습니다.export speed
사용자 정의 모양새를 정의합니다.
이렇게 하면 퍼블릭 처리가 되고 다른 코드에서 이 값을 인용할 수 있다.
코드 블록
.code_start에서.code_end까지 코드 블록으로 실제 이동 부분이 적혀 있습니다..code_start
.export _start
_start:
PUSH, speed
PUSH, value_0
COPY
PUSH, instance_0
PUSH, name_0
PUSH, value_0
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
JUMP, 0xFFFFFF
.code_end
주요한 처리는 사전에 준비한 함수에 대한 것이다.
Unity에서 실행 시기를 결정할 수 있습니다.
예를 들어, 시작할 때 한 번만 각 프레임이 업데이트됩니다.
시작 노드_start:
가 추가되었습니다.
UAssembly는 블록을 들여쓰기(들여쓰기)로 결정하는 것 같아요.
_start: 시작할 때 한 번만 축소 범위를 실행합니다.
구성 요소가push 다른 함수에서 함수를 읽는 데 필요한 값을 실행하고 있습니다.
UAssembly에서도 그랬어요.COPY
특정 변수의 값을 특정 변수로 복사합니다.
여기서 미리PUSH, speed
PUSH, value_0
통하다
speed 참조 값을value_0으로 복사하는 것 같습니다.
호출 함수 부분EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
태그 요소의 표시 속성을 수정합니다.
이 함수는 VrCUdon Commoninterfaces IUdon EventReceiver입니다.Set Program Variable이라는 이름으로.
SystemString 및 SystemObject의 데이터를 수신하고 SystemVoid (즉, 데이터를 반환하지 않음) 로 돌아갑니다.
따라서 실행하기 전에 필요한 데이터PUSH, name_0
PUSH, value_0
너한테 맡긴 것 같아.
그리고 모든 것이 끝났다JUMP, 0xFFFFFF
.
이것은 그것이 메모리의 마지막 부분까지 날아가면 끝난다는 것을 나타낸다.
Rotating_Cube
실제 회전하는 노드와 UAssembly.
.data_start
.export signal
instance_0: %UnityEngineTransform, this
axis_0: %UnityEngineVector3, null
angle_0: %SystemSingle, null
Single_0: %SystemSingle, null
Single_1: %SystemSingle, null
instance_1: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
signal: %VRCUdonUdonBehaviour, this
.data_end
.code_start
.export _update
_update:
PUSH, Single_0
EXTERN, "UnityEngineTime.__get_deltaTime__SystemSingle"
PUSH, signal
PUSH, instance_1
COPY
PUSH, instance_1
PUSH, name_0
PUSH, Single_1
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__GetProgramVariable__SystemString__SystemObject"
PUSH, Single_0
PUSH, Single_1
PUSH, angle_0
EXTERN, "SystemSingle.__op_Multiplication__SystemSingle_SystemSingle__SystemSingle"
PUSH, instance_0
PUSH, axis_0
PUSH, angle_0
EXTERN, "UnityEngineTransform.__Rotate__UnityEngineVector3_SystemSingle__SystemVoid"
JUMP, 0xFFFFFF
.code_end
쓰기 방법이 같기 때문에 Signal_나는 큐브의 해설 부분을 보면 대체로 무엇을 하고 있는지 알 수 있다고 생각한다.
이번에 업데이트 노드_update:
를 넣었기 때문이다.
또한 방금 VRCUdonCommonInterfacesIUdonEventReceiver.SetProgramVariable
에서 반환 값은 Void (없음) 입니다.EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__GetProgramVariable__SystemString__SystemObject"
그러면 반환값이 System Object이기 때문에.
그것을 받아들이기 위해 사전에 파라미터를 덧붙인 것PUSH, name_0
또한 반환 값 PUSH, Single_1
을 수신하는 데도 사용됩니다.
따라서 반환 값은 Single_1이 들어가니까 다음.EXTERN, "UnityEngineTransform.__Rotate__UnityEngineVector3_SystemSingle__SystemVoid"
의 명세란 스타일에 정의된 설정입니다.
마지막
확장된 언어도 만들 수 있을 것 같아.
흥미가 있는 사람은 편지에 동봉한다
UdonAssemblyProgramAsset.cs를 UdonGraphProgramAsset으로 설정합니다.cs 열기
보니까 좋은 것 같아.
Reference
이 문제에 관하여(UAssembly 읽기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gatosyocora/items/90722a33e9528b432fa1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
.data_start
.export speed
instance_0: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
value_0: %SystemObject, null
speed: %SystemSingle, null
.data_end
.code_start
.export _start
_start:
PUSH, speed
PUSH, value_0
COPY
PUSH, instance_0
PUSH, name_0
PUSH, value_0
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
JUMP, 0xFFFFFF
.code_end
.data_start
.export speed
instance_0: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
value_0: %SystemObject, null
speed: %SystemSingle, null
.data_end
.code_start
.export _start
_start:
PUSH, speed
PUSH, value_0
COPY
PUSH, instance_0
PUSH, name_0
PUSH, value_0
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__SetProgramVariable__SystemString_SystemObject__SystemVoid"
JUMP, 0xFFFFFF
.code_end
.data_start
.export signal
instance_0: %UnityEngineTransform, this
axis_0: %UnityEngineVector3, null
angle_0: %SystemSingle, null
Single_0: %SystemSingle, null
Single_1: %SystemSingle, null
instance_1: %VRCUdonUdonBehaviour, this
name_0: %SystemString, null
signal: %VRCUdonUdonBehaviour, this
.data_end
.code_start
.export _update
_update:
PUSH, Single_0
EXTERN, "UnityEngineTime.__get_deltaTime__SystemSingle"
PUSH, signal
PUSH, instance_1
COPY
PUSH, instance_1
PUSH, name_0
PUSH, Single_1
EXTERN, "VRCUdonCommonInterfacesIUdonEventReceiver.__GetProgramVariable__SystemString__SystemObject"
PUSH, Single_0
PUSH, Single_1
PUSH, angle_0
EXTERN, "SystemSingle.__op_Multiplication__SystemSingle_SystemSingle__SystemSingle"
PUSH, instance_0
PUSH, axis_0
PUSH, angle_0
EXTERN, "UnityEngineTransform.__Rotate__UnityEngineVector3_SystemSingle__SystemVoid"
JUMP, 0xFFFFFF
.code_end
확장된 언어도 만들 수 있을 것 같아.
흥미가 있는 사람은 편지에 동봉한다
UdonAssemblyProgramAsset.cs를 UdonGraphProgramAsset으로 설정합니다.cs 열기
보니까 좋은 것 같아.
Reference
이 문제에 관하여(UAssembly 읽기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gatosyocora/items/90722a33e9528b432fa1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)