ハツェの真時代傾向璋

興味を持ったことを書いていく鱗片的な場所から先の未来の場

U# 入門 おまけ

こんばんは。ハツェです。
今回も、Udonスクリプトで制作するための記事を書いていきます。
前回はuGUIでUdonを扱う方法について紹介しました。
今回はもう前提知識として伝えることは伝えたので、おまけ回です。
動作環境は、Unity : 2019.4.29f1、VRCSDK : 2021.08.11.15.16、U# : v0.20.2です。

目次


U#公式のWIki

公式Wikiは全て英語記載です。

イベント関数表

github.com

API

github.com

使用出来る属性表

github.com

昔のTriggerに対応するイベント関数

OnEnable

オブジェクトを有効化した際に呼ばれる関数

void OnEnable() { }


OnDisable

オブジェクトを無効化した際に呼ばれる関数

void OnDisable() { }


OnSpawn

オブジェクトが生成された際に呼ばれる関数

public override void OnSpawn() { }


OnDestroy

オブジェクトが破壊された際に呼ばれる関数

void OnDestroy() { }


OnInteract

UdonBehaviorがアタッチされたオブジェクトをインタラクトした際に呼ばれる関数

public override void Interact() { }


OnNetworkReady

完全に対応するものはないです。
代わりとまでは行きませんが、一応OnPreSerializationとOnDeserializationというものがあります。

OnPreSerialization

シリアル化されたデータが送信される直前に呼ばれる関数
オーナー以外のプレーヤー用に更新する同期変数を設定するのに適しています。

public override void OnPreSerialization() { }


OnDeserialization

変数が同期された時に呼ばれる関数
同期変数を受信した段階で処理を設定するのに適しています。

public override void OnDeserialization() { }


OnPlayerJoined

プレイヤーがインスタンスに入ってきた際に呼ばれる関数

public override void OnPlayerJoined(VRCPlayerApi player) { }


OnPlayerLeft

プレイヤーがインスタンスから抜けた際に呼ばれる関数

public override void OnPlayerLeft(VRCPlayerApi player) { }


OnPickup

Pickupオブジェクトをピックアップした際に呼ばれる関数

public override void OnPickup() { }


OnPickupUseDown

AutoHoldがYesのPickupオブジェクトをつかんでいる時、トリガーを引いた際に呼ばれる関数

public override void OnPickupUseDown() { }


OnPickupUseUp

AutoHoldがYesのPickupオブジェクトをつかんでいる時、トリガーを離した際に呼ばれる関数

public override void OnPickupUseUp() { }


OnDrop

Pickupオブジェクトのピックアップを離した際に呼ばれる関数

public override void OnDrop() { }


OnTimer

対応するものはないです。
なので、Update関数内とかでカウントダウン機構を作る必要があります。

OnEnterTrigger

コライダーに入った時かつ衝突するオブジェクトのうち、1つ以上にIsTriggerにチェックがついていた際に呼ばれる関数
プレイヤーの判定には使えません。プレイヤー用の関数はこちら

void OnTriggerEnter(Collider other) { }
void OnTriggerEnter2D(Collider2D other) { }


OnTriggerStay

おまけで掲載。
コライダー内にいるかつ衝突するオブジェクトのうち、1つ以上にIsTriggerにチェックがついていた際に呼ばれる関数
プレイヤーの判定には使えません。プレイヤー用の関数はこちら

void OnTriggerStay(Collider other) { }
void OnTriggerStay2D(Collider2D other) { }


OnExitTrigger

コライダーから出る時かつ衝突するオブジェクトのうち、1つ以上にIsTriggerにチェックがついていた際に呼ばれる関数
プレイヤーの判定には使えません。プレイヤー用の関数はこちら

void OnTriggerExit(Collider other) { }
void OnTriggerExit2D(Collider2D other) { }


OnEnterCollider

コライダーに入った時かつ衝突するオブジェクトのうち、どっちにもIsTriggerにチェックがついていない際に呼ばれる関数
プレイヤーの判定には使えません。プレイヤー用の関数はこちら

void OnCollisionEnter(Collision other) { }
void OnCollisionEnter2D(Collision2D other) { }


OnCollisionStay

おまけで掲載。
コライダー内にいる時かつ衝突するオブジェクトのうち、どっちにもIsTriggerにチェックがついていない際に呼ばれる関数
プレイヤーの判定には使えません。プレイヤー用の関数はこちら

void OnCollisionStay(Collision other) { }
void OnCollisionStay2D(Collision2D other) { }


OnExitCollider

コライダーから出る時かつ衝突するオブジェクトのうち、どっちにもIsTriggerにチェックがついていない際に呼ばれる関数
プレイヤーの判定には使えません。プレイヤー用の関数はこちら

void OnCollisionExit(Collision other) { }
void OnCollisionExit2D(Collision2D other) { }


OnControllerColliderHit (旧OnAvaterHit)

プレイヤーと衝突した際に呼ばれる関数
※現状は機能してない模様※
廃止されました。正式に実装されたものはOnPlayerTriggerEnter以下をご覧ください。

public void OnControllerColliderHit(ControllerColliderHit hit) { }


OnOwnershipTransfer

オブジェクトのOwnerが移った際に呼ばれる関数

public override void OnOwnershipTransferred() { }


OnKeyDown

対応するものはないです。
追加アップデートで一部対応しました。
なので、Update関数内で以下のような記述をする必要があります。

void Update()
{
    if(Input.GetKeyDown(/*KeyCode*/)) { }
}


OnKeyUp

対応するものはないです。
追加アップデートで一部対応しました。
なので、Update関数内で以下のような記述をする必要があります。

void Update()
{
    if(Input.GetKeyUp(/*KeyCode*/)) { }
}


OnStationEntered

Stationに入った時に呼ばれる関数

public override void OnStationEntered() { }


OnStationExited

Stationから出た時に呼ばれる関数

public override void OnStationExited() { }


OnParticleCollision

パーティクルがGameObjectのコライダーに衝突した際に呼ばれる関数
プレイヤーは取得できないため、代わりにOnPlayerParticleCollisionを使う必要があります。

void OnParticleCollision(GameObject other) { }


2020/09/19以降に追加されたイベント関数

OnVideoReady

自身のオブジェクトのビデオプレイヤーが準備完了した際に呼ばれる関数

public override void OnVideoReady() {  }


OnVideoStart

自身のオブジェクトのビデオプレイヤーが停止状態から再生を開始した際に呼ばれる関数

public override void OnVideoStart() {  }


OnVideoPlay

自身のオブジェクトのビデオプレイヤーがキュー内の新たなビデオの開始・一時停止解除・プレイヤーの操作により再生を開始した際に呼ばれる関数

public override void OnVideoPlay() {  }


OnVideoPause

自身のオブジェクトのビデオプレイヤーが一時停止した際に呼ばれる関数

public override void OnVideoPause() {  }


OnVideoEnd

自身のオブジェクトのビデオプレイヤーの再生が終了した場合、もしくはプレイヤーによって止められた場合に呼ばれる関数

public override void OnVideoPause() {  }


OnVideoLoop

自身のオブジェクトのビデオプレイヤーがループした際に呼ばれる関数

public override void OnVideoLoop() {  }


OnVideoError

自身のオブジェクトのビデオプレイヤーに何かしらのエラーが発生した際に呼ばれる関数

public override void OnVideoError(VideoError videoError) {  }


OnPlayerTriggerEnter

プレイヤーがIsTriggerのついたコライダーに入った際に呼ばれる関数

public override void OnPlayerTriggerEnter(VRCPlayerApi player) { }


OnPlayerTriggerStay

プレイヤーがIsTriggerのついたコライダー内にいる時に呼ばれる関数

public override void OnPlayerTriggerStay(VRCPlayerApi player) { }


OnPlayerTriggerExit

プレイヤーがIsTriggerのついたコライダーから出た際に呼ばれる関数

public override void OnPlayerTriggerExit(VRCPlayerApi player) { }


OnPlayerCollisionEnter

プレイヤーがIsTriggerのついていない物理挙動で動いているコライダーに入った際に呼ばれる関数
静止したオブジェクトに対しては反応しないため、静止オブジェクトには代わりにOnPlayerTriggerEnterを使います。

public override void OnPlayerCollisionEnter(VRCPlayerApi player) { }


OnPlayerCollisionStay

プレイヤーがIsTriggerのついていない物理挙動で動いているコライダー内にいる際に呼ばれる関数
静止したオブジェクトに対しては反応しないため、静止オブジェクトには代わりにOnPlayerTriggerStayを使います。

public override void OnPlayerCollisionStay(VRCPlayerApi player) { }


OnPlayerCollisionExit

プレイヤーがIsTriggerのついていない物理挙動で動いているコライダーから出た際に呼ばれる関数
静止したオブジェクトに対しては反応しないため、静止オブジェクトには代わりにOnPlayerTriggerExitを使います。

public override void OnPlayerCollisionExit(VRCPlayerApi player) { }


OnPlayerParticleCollision

プレイヤーとParticleのCollisionが衝突した際に呼ばれる関数
ParticleSystemでSendCollisionMessagesをOnにしておく必要があります。

public override void OnPlayerParticleCollision(VRCPlayerApi player) { }


2021/03/11以降に追加されたイベント関数

入力系については以下の情報が全てに当てはまります。

  • value : args.boolValueもしくはargs.floatValueのどちらかの情報を入力値に応じて示す変数
  • args.eventType : 入力している媒体がBUTTONかAXISかを出力する変数
  • args.boolValue : boolの入力値を示す変数
  • args.floatValue : floatの入力値を示す変数
  • args.handType : VRなら右手か左手かを出力、デスクトップならキーボードを左手、マウスを右手として示す変数


一方、MIdi系については以下の情報が当てはまります。

  • channel : 取得したMidiチャンネルを示す変数
  • number : 取得した0~127のNote番号を示す変数
  • velocity : 取得したMidiNoteの強さや速度を示す変数
  • value : 取得したコントローラーから出力された値を示す変数
  • InputJump

    Jumpに用いるボタンが押された際に呼ばれる関数

    public override void InputJump(bool value, UdonInputEventArgs args) { }
    

    InputUse

    Useに用いるボタンが押された際に呼ばれる関数

    public override void InputUse(bool value, UdonInputEventArgs args) { }
    

    InputGrab

    Grabに用いるボタンが押された際に呼ばれる関数

    public override void InputGrab(bool value, UdonInputEventArgs args) { }
    

    InputDrop

    Dropに用いるボタンが押された際に呼ばれる関数

    public override void InputDrop(bool value, UdonInputEventArgs args) { }
    

    InputMoveHorizontal

    移動の水平方向に用いるボタン及びスティックが入力されている際に呼ばれる関数
    実質左スティックの水平方向の値が取得出来ます。

    public override void InputMoveHorizontal(float value, UdonInputEventArgs args) { }
    

    InputMoveVertical

    移動の垂直方向に用いるボタン及びスティックが入力されている際に呼ばれる関数
    実質左スティックの垂直方向の値が取得出来ます。

    public override void InputMoveVertical(float value, UdonInputEventArgs args) { }
    

    InputLookHorizontal

    視点の水平方向が移動した(視点ポイントに差異が生じた)際に呼ばれる関数
    VRコントローラーの場合、ComfortTurningの移動設定をしていない場合のみ使用可能と公式ドキュメントには書いてあるが、実質右スティックの水平方向の値が取得出来ます。

    public override void InputLookHorizontal(float value, UdonInputEventArgs args { }
    

    InputLookVertical

    視点の垂直方向が移動した(視点ポイントに差異が生じた)際に呼ばれる関数
    現在はVRのコントローラーには対応していないと公式ドキュメントには書いてあるが、実質右スティックの垂直方向の値が取得出来ます。

    public override void InputLookVertical(float value, UdonInputEventArgs args) { }
    

    MidiNoteOn

    Midiキーボードを押した(MidiNoteのOnメッセージを受信した)際に呼ばれる関数

    public override void MidiNoteOn(int channel, int number, int velocity) { }
    

    MidiNoteOff

    Midiキーボードを離した(MidiNoteのOffメッセージを受信した)際に呼ばれる関数

    public override void MidiNoteOff(int channel, int number, int velocity) { }
    

    MidiControlChange

    Midiバイスのスライダーやノブを変更した(コントロールの変更を受信した)際に呼ばれる関数

    public override void MidiControlChange(int channel, int number, int value) { }
    

    OnPlayerRespawn

    落下したり、Respawnボタンを押したりしてプレイヤーがRespawnした際に呼ばれる関数

    public override void OnPlayerRespawn(VRCPlayerApi player) { }
    

    2021/07/08以降に追加されたイベント関数

    OnValueChanged

    変数の値が変更された時に呼ばれるイベント
    詳しくはこちらを参照

    PostLateUpdate

    IKが計算された後のフレームの終わり付近で呼ばれる関数

    public override void PostLateUpdate()
    

    2023/02/23以降に追加されたイベント関数

    OnImageLoadSuccess

    画像が正常にダウンロードされた際に呼ばれる関数

    public override void OnImageLoadSuccess(VRC.SDK3.Image.IVRCImageDownload result)
    

    OnImageLoadError

    画像がダウンロード出来なかった際に呼ばれる関数

    public override void OnImageLoadError(VRC.SDK3.Image.IVRCImageDownload result)
    



    他にもUnityにあるイベント関数も使うことが出来ます。
    使えるイベント関数はこちらをご覧ください。
    全て

    void ~~~~~~() {}
    
    で使用することが出来ると思います。
    例えば、void OnJointBreak(float breakForce)とかOnRenderImage(RenderTexture source, RenderTexture destination)とか。

    頻度が高い or 凄い長い型や属性や関数

    UdonSync

    [UdonSynced(UdonSyncMode.None)]
    [UdonSynced(UdonSyncMode.Linear)]
    [UdonSynced(UdonSyncMode.Smooth)]
    [UdonSynced(UdonSyncMode.NotSynced)]
    

    SendCustomNetworkEvent

    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "FunctionName");
    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.Owner, "FunctionName");
    

    LocalPlayerの取得

    var localPlayer =  Networking.LocalPlayer
    

    オーナーの判別

    var flag =  Networking.IsOwner(TargetGameobject);
    

    VideoPlayerの型

    private VRC.SDK3.Video.Components.Base.BaseVRCVideoPlayer _videoPlayer;
    

    VRCInputField

    private VRC.SDK3.Components.VRCUrlInputField _inputfield;
    

    PlayHapticEventInHand

    Networking.LocalPlayer.PlayHapticEventInHand(VRC_Pickup.PickupHand.Left, 0, 0, 0);
    Networking.LocalPlayer.PlayHapticEventInHand(VRC_Pickup.PickupHand.Right, 0, 0, 0);
    

    関数を再帰的に使用する際に用いる属性

    [RecursiveMethod]
    private 型 関数名 { }