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 열기
보니까 좋은 것 같아.

좋은 웹페이지 즐겨찾기