Teachers open the door but You must enter by yourself.

Open Media Lab.オープンメディアラボ

弓のセットアップ

弓を Left Controller の子に配置

  1. Rotation の x を 90 に変更
  2. VRで確認して、弓の Position を調整する

アニメーション機能の設定(未設定の場合)

  1. Animation コンポーネントを追加
  2. アニメーションクリップ「Bow/BowPullAnimation」を追加
  3. アニメーションクリップ「Bow/BowReleaseAnimation」を追加
  4. play Automatically のチェックをはずす

右コントローラのトリガー入力を取得

  1. 弓の機能を呈するスクリプト Bow.cs を作成し、Bow にアタッチ
    
    using UnityEngine;
    using UnityEngine.InputSystem;
    
    public class Bow : MonoBehaviour
    {
    	public InputAction trigger;
    
    	void OnFire(InputAction.CallbackContext c){
    		Debug.Log("fire"); //コンソールウィンドウにFireと出力
    	}
    
    	void Awake(){ //トリガーが押されたらOnFire関数を実行するように設定
    		trigger.performed+=OnFire;
    	}
    
    	void OnEnable(){
    		trigger.Enable();
    	}
    }
    
  2. 右コントローラのトリガーボタンを Inspector でtriggger変数にバインド
  3. トリガーボタンを引く動作が取得されていることをVRで確認する

コントローラ間の距離の取得

  1. Bow.csに赤字の部分を追記
    
    using UnityEngine;
    using UnityEngine.InputSystem;
    
    public class Bow : MonoBehaviour
    {
    	public InputAction trigger;
    	public Transform leftController;	
    	public Transform rightController;
    	
    	//コントローラ間の距離を取得するgetter
    	float Distance=>Vector3.Distance(leftController.position, rightController.position);
    
    	void Update()
    	{
    		Debug.Log(Distance);
    	}
    
    	・・・(以下、省略)
    }
    
  2. Left & Right Controller を Inspector で Drag&Drop (D&D)

弓を引く動作の実現

  1. Bow.csに赤字の部分を追記
    
    using UnityEngine;
    using UnityEngine.InputSystem;
    
    public class Bow : MonoBehaviour
    {
    	public InputAction trigger;
    	public Transform leftController;	
    	public Transform rightController;
    		
    	float Distance=>Vector3.Distance(leftController.position, rightController.position);
    
    	enum State{Idle, Grab, Pull} //何もしていない・弦を握った・弦を引いた、の3状態
    	State state=State.Idle;
    	
    	void Update()
    	{
    		switch(state){
    			case State.Idle:
    				if(Distance<0.4f){ //コントローラ距離が40cmより小さい
    					state=State.Grab;
    				}
    				break;
    			case State.Grab:
    				if(Distance>0.4f){ //コントローラ距離が40cmより大きい
    					GetComponent<Animation>().Play("BowPullAnimation"); //弓を弾くアニメーション
    					state=State.Pull;
    				}
    				break;
    		}
    		// Debug.Log(Distance);
    	}
    
    	void OnFire(InputAction.CallbackContext c){
    		if(state==State.Pull){
    			//弦を離すアニメーションを実行
    			//状態をIdleに移行
    		}
    		// Debug.Log("fire");
    	}
    
    	・・・(以下、省略)
    }
    
This site is powered by
Powered by MathJax