Teachers open the door but You must enter by yourself.

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

矢のセットアップ

  1. 矢にRigidbodyコンポーネントを追加し、Use Gravity のチェックを外す
  2. Capsule Collider を追加し、Radius=0.03、Height=0.8、Is Trigger にチェックを付ける
  3. 矢の機能を呈するスクリプト Arrow.cs を作成し、Arrow にアタッチ
    
    using UnityEngine;
    
    public class Arrow : MonoBehaviour
    {
    	public float velocity=10f;
    	public float magnify=2f;
    	public bool flying=false;
    
    	public Horse horse;
    	public Transform bow;
    
    	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;
    		}
    	}
    }
    
  4. Horse, Bow を Inspector で D&D
  5. Bow.cs に以下のスクリプトを追記
    
    using UnityEngine;
    using UnityEngine.InputSystem;
    
    public class Bow : MonoBehaviour
    {
    	public InputAction trigger;
    	public Transform leftController;	
    	public Transform rightController;
    	public Arrow arrow;
    		
    	enum State{Idle, Grab, Pull}
    	State state=State.Idle;
    	
    	float Distance=>Vector3.Distance(leftController.position, rightController.position);
    
    	void Update()
    	{
    		switch(state){
    			case State.Idle:
    				if(Distance<0.4f && !arrow.flying){
    					arrow.Ready();
    					state=State.Grab;
    				}
    				break;
    			case State.Grab:
    				if(Distance>0.4f){
    					GetComponent<Animation>().Play("BowPullAnimation");
    					state=State.Pull;
    				}
    				break;
    		}
    	}
    
    	void OnFire(InputAction.CallbackContext c){
    		if(state==State.Pull){
    			GetComponent<Animation>().Play("BowReleaseAnimation");
    			arrow.Fire();
    			state=State.Idle;
    		}
    	}
    
    	・・・
    }
    
  6. Arrow を Inspector で D&D
  7. This site is powered by
    Powered by MathJax