ベクトル


考察 時速(スピード)とベクトルの関係


Vector3 posA = new Vector3(1.0f , 0 ,1.0f);

これにより一つの地点が出来上がる。そして原点(0.0f, 0.0f , 0.0f)を含めると2点のVector3がありこの2点で方向性を表現できる。さらに

posA.magnitude

によりこの2点間の距離が求められる。この場合1.414~。つまり√2が出力されている(これは三角関数で習ったとおりの結果)
このベクトルposAをあるオブジェクトの座標に毎フレーム足算すると、常に毎時一定距離移動するので
posA.magnitudeはスピードの概念に化ける

つまり

public GameObject go;
Update(){
   go.transform.position += posA;
}

であれば posA.magnitude はフレーム毎の時速になる。Update()は1秒間に60回呼ばれるので
posA.magnitude = 1/60 の場合、秒速1ユニティグリッドになる。

上記の考えを利用して「posAが可変で」「オブジェクトの移動速度に秒速1ユニティグリッドの制限速度を設けたい」と考えた場合

floar speedMax = 1/60;
public GameObject go;
Update(){
   Vector3 posA_limitMax = posA;
    if(posA.magnitude > speedMax){
         posA_limitMax *= speedMax / posA.magnitude;
    }
    go.transform.position += posA_limitMax; 
}

とすると制限速度を適用できる

サンプル1



using UnityEngine;
using System.Collections;

public class shoot : MonoBehaviour {
  
   
   public GameObject player,Target;
   public    float    maxRange;
   
   // Use this for initialization
   void Start () {
       player = GameObject.Find("Ship");
       Target = GameObject.Find("TargetEnemy");
       
       // プレイヤーの位置からターゲットの位置を指すヘディング(目標)を取得 
       var heading = Target.transform.position - player.transform.position;
       print("heading=" + heading);
       
       //真上から見た方向に対応 
       heading.y=0;
       
       
       /*ターゲットオブジェクトの方向を指すとともに
        * このベクトルの大きさは二つの位置の間の距離に等しくなります
        * 一般的にはターゲットを向いた正規化されたベクトルが必要となります(発射物を向ける場合も同様)
        * オブジェクトの間の距離は向かっているベクトルと等しく
        * このベクトルを正規化するためには大きさで割ります(距離1における各軸の進み具合と考えると良い)
       */ 
       
       //こちらは簡単に正規化する方法 ディレクション(方向性)を取得 
       var direction  = Vector3.Normalize(heading);
       
       //こちらは計算して求める方法 
       var distance = heading.magnitude;    //magnitude関数はベクトルの長さを返す(この計算には平方根が使われる) ディスタンス(距離)=大きさ  
       var direction2 = heading/distance;
       
       print("direction=" + direction);
       print("distance=" + distance);
       print("direction2=" + direction2);
       
       //距離に応じて処理を変更する場合
       //sqrMagnitudeは平方根が使われないので高速 
       if(heading.sqrMagnitude < maxRange * maxRange){
           print("maxRange enter");
       }
       else {print("maxRange noEnter");}
       
       //目標へと方向転換する処理(敵がこちらを向いたり砲台を敵に向けるなどに使える) 
       player.transform.rotation = Quaternion.LookRotation(heading);
       
   }
   
   // Update is called once per frame
   void Update () {
       
   }
   
   //ギズモ表示用の標準メンバー関数 
   void OnDrawGizmos ()
   {
       Gizmos.color = Color.yellow;
       Gizmos.DrawWireSphere (transform.position, maxRange);    //半径maxRangeの球を表示
   }
   
   //デバッグ表示に使える
   Vector3 GetPosition(string targetName){
       GameObject go = GameObject.Find(targetName);
       return go.transform.position;
   }
   
}

サンプル2


using UnityEngine;
using System.Collections;

public class vector2 : MonoBehaviour {
  
   GameObject aObject,bObject,cObject,particle;
   private Vector3 moveDirection = Vector3.zero;
   CharacterController control;

  // Use this for initialization
   void Start () {
       aObject = GameObject.Find("A");
       bObject = GameObject.Find("B");
       cObject = GameObject.Find("C");
       particle= GameObject.Find("TestParticleSystem");
       
       control = cObject.GetComponent<CharacterController>();
   }
   
   // Update is called once per frame
   void Update () {
       
       moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0,Input.GetAxis("Vertical") );
       control.Move(moveDirection*Time.deltaTime*10);
       
       
       //ここからが重要(A,B、Cの3点から法線を求めている)
       var side1 = bObject.transform.position - aObject.transform.position;
       var side2 = cObject.transform.position - aObject.transform.position;
       
       var pref = Vector3.Cross(side1,side2);
       
       particle.transform.rotation=Quaternion.LookRotation(pref);
   }
}

ベクター


transform.Translate()関数は相対位置。transform.positionは絶対座標指定


<注意点>
publicでプロパティとしてunityエディタ上に公開しgameObjectとして配置した場合、値をコードエディタ側で変更しても
ユニティエディタ側で「reset」しないと以前の値が残ってしまい変更が反映されていないように見えてしまう。注意する事!

using UnityEngine;
using System.Collections;

public class vector : MonoBehaviour {
  
   public    Vector3 pos=new Vector3(10,10,1);
   
   // Use this for initialization
   void Start () {
       transform.Translate(pos);
       pos.Normalize();
   }
   
この上の例でVector3(10,10,1)の値を変更してもエディタ上では変更が反映されない。なぜならエディタ上の値は
以前のものが残っているから。



<相対位置指定>
この場合、オブジェクトはフレーム更新のたび上へ上がっていく

  // Update is called once per frame
   void Update () {
       transform.Translate(Time.deltaTime*Vector3.up); 
   }



<絶対位置指定>

  void Update () {
       transform.position = new Vector3(5,2,3); 
   }

メニュー



  • 最終更新:2014-06-13 12:10:59

このWIKIを編集するにはパスワード入力が必要です

認証パスワード