Teachers open the door but You must enter by yourself.

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

矢のセットアップ

矢を弓にセット

  1. 矢の機能を呈するスクリプト Arrow.cs を作成し、Arrow にアタッチ
    
    using UnityEngine;
    
    public class Arrow : MonoBehaviour
    {
    	public Transform bow;
    
    	public void Ready(){ //矢を弓にセット
    		transform.localScale=Vector3.one;
    		GetComponent<Rigidbody>().linearVelocity=Vector3.zero;
    		transform.parent=bow;
    		transform.localPosition=new Vector3(0, 0, -0.3f);
    		transform.localRotation=Quaternion.Euler(90f, 0f, 0f);
    	}
    }
    
  2. Bow を Inspector で D&D
  3. Bow.cs に以下のスクリプトを追記
    
    using UnityEngine;
    using UnityEngine.InputSystem;
    
    public class Bow : MonoBehaviour
    {
    	public InputAction trigger;
    	public Transform leftController;	
    	public Transform rightController;
    	public Arrow arrow;
    	
    	float Distance=>Vector3.Distance(leftController.position, rightController.position);
    		
    	enum State{Idle, Grab, Pull}
    	State state=State.Idle;
    
    	void Update()
    	{
    		switch(state){
    			case State.Idle:
    				if(Distance<0.4f){
    					state=State.Grab;
    					arrow.Ready();
    				}
    				break;
    			case State.Grab:
    				if(Distance>0.4f){
    					GetComponent<Animation>().Play("BowPullAnimation");
    					state=State.Pull;
    				}
    				break;
    		}
    	}
    
    	・・・(以下、省略)
    }
    
  4. Arrow を Inspector で D&D

矢を発射

  1. 矢にRigidbodyコンポーネントを追加し、Use Gravity のチェックを外す
  2. Arrow.cs に以下のスクリプトを追記
    
    using UnityEngine;
    
    public class Arrow : MonoBehaviour
    {
    	public Transform bow;
    	public Horse horse;
    
    	public float velocity=10f;
    	public bool flying=false;
    
    
    	float launchTime;//射出時刻
    	Vector3 Velocity=>Vector3.forward*horse.velocity + transform.up*velocity; //馬+矢
    	float FlyingTime=>Time.time-launchTime; //矢の飛行時間
    
    	public void Ready(){
    		transform.localScale=Vector3.one;
    		GetComponent<Rigidbody>().linearVelocity=Vector3.zero;
    		transform.parent=bow;
    		transform.localPosition=new Vector3(0, 0, -0.3f);
    		transform.localRotation=Quaternion.Euler(90f, 0f, 0f);
    		flying=false;
    	}
    
    	public void Fire(){
    		transform.parent=null;
    		GetComponent<Rigidbody>().linearVelocity=Velocity;
    		launchTime=Time.time;
    		flying=true;
    	}
    }
    
  3. Horse を Inspector で D&D
  4. Bow.cs に以下のスクリプトを追記
    
    	・・・(以上、省略)
    
    	void OnFire(InputAction.CallbackContext c){
    		if(state==State.Pull){
    			GetComponent<Animation>().Play("BowReleaseAnimation");
    			state=State.Idle;
    			arrow.Fire();
    		}
    	}
    
    	・・・(以下、省略)
    
    

矢を拡大

(実際にはあり得ませんが)矢は遠ざかると見えなくなるので、徐々に拡大する処理を追加します。

  1. Arrow.cs に以下のスクリプトを追記
    
    using UnityEngine;
    
    public class Arrow : MonoBehaviour
    {
    	public Transform bow;
    	public Horse horse;
    
    	public float velocity=10f;
    	public bool flying=false;
    	public float magnify=2f;
    
    
    	float launchTime;
    	Vector3 Velocity=>Vector3.forward*horse.velocity + transform.up*velocity;
    	float FlyingTime=>Time.time-launchTime;
    	Vector3 FlyingScale=>Vector3.one * (1f + magnify*FlyingTime);
    
    	public void Ready(){
    		transform.localScale=Vector3.one;
    		GetComponent<Rigidbody>().linearVelocity=Vector3.zero;
    		transform.parent=bow;
    		transform.localPosition=new Vector3(0, 0, -0.3f);
    		transform.localRotation=Quaternion.Euler(90f, 0f, 0f);
    		flying=false;
    	}
    
    	public void Fire(){
    		transform.parent=null;
    		GetComponent<Rigidbody>().linearVelocity=Velocity;
    		launchTime=Time.time;
    		flying=true;
    	}
    
    	void Update()
    	{
    		if(flying){
    			transform.localScale=FlyingScale;
    			if(FlyingTime>3f) flying=false;
    		}
    	}
    }
    

課題

以上の処理だけでは、矢が飛んでいる間にも、新しく矢を発射できてしまいます。矢が飛んでいる間は、新しく矢を装填できないように改良しましょう。

This site is powered by
Powered by MathJax