天天看點

Unity知識總結系列(一):物體移動方法

在蠻牛上看的總結,講的很細緻。轉過來自己看,也分享給大家。

原文連結:Unity知識總結系列(一):物體移動方法

http://www.manew.com/thread-114623-1-1.html

(出處: -【遊戲蠻牛】-ar增強現實,虛拟現實,unity3d,unity3d教程下載下傳首選u3d,unity3d官網)

在 中,有多種方式可以改變物體的坐标,實作移動的目的,其本質是每幀修改物體的position 。 一、Transform類 (兩種) Transform  元件用于描述物體在空間中的狀态,它包括 位置 (position) , 旋轉 (rotation) 和 縮放 (scale) 。 其實所有的移動都會導緻 position 的改變 1、transform.position += new Vector3 ( 0,0,3 ); 這裡所說的通過Transform 元件來移動物體,指的是直接操作 Transform 來控制物體的位置 (position) 。 改變方式可以是自定義的三位向量,也可以是transform 的自身方向,也可以是 vector3 的世界坐标方向 局部(自身)坐标,隻有坐标軸的正方向沒有負方向 Transform.forward  向前 Transform.right  向右 Transform.up  向上 世界坐标 Vector3.forward  向前 Vector3.back  向後 Vector3.left  向左 Vector3.right  向右 Vector3.up  向上 Vector3.down  向下 Vector3.zero  零點 Vector3.one  指向( 1,1,1 )的機關向量 void  Update (){          //局部坐标 Local          //transform.position += transform.forward * Time.deltaTime;          //transform.position += transform.right * Time.deltaTime;          //transform.position += transform.up * Time.deltaTime;          //世界坐标 Global          //transform.position += new Vector3(0, 0, 2) * Time.deltaTime;          //transform.position += Vector3.forward * Time.deltaTime;          //transform.position += Vector3.back * Time.deltaTime;          //transform.position += Vector3.left * Time.deltaTime;          //transform.position += Vector3.right * Time.deltaTime;          //transform.position += Vector3.up * Time.deltaTime;          //transform.position += Vector3.down * Time.deltaTime;          //transform.position += Vector3.one * Time.deltaTime;     } 2、Transform.Translate ( transform.forward * Time.deltaTime ); 該方法可以将物體從目前位置,移動到指定位置,并且可以選擇參照的坐标系。  當需要進行坐标系轉換時,可以考慮使用該方法以省去轉換坐标系的步驟。 void  Update (){          //在使用transform自身局部坐标時,第二個參數的作用不大          //transform.Translate(transform.forward * Time.deltaTime);          //transform.Translate(transform.forward * Time.deltaTime, Space.Self);          //transform.Translate(transform.forward * Time.deltaTime, Space.World);          //不寫第二個參數,預設局部坐标,使用第二個參數設定為世界坐标時使用世界坐标系          //transform.Translate(Vector3.forward * Time.deltaTime);          //transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);          //transform.Translate(Vector3.forward * Time.deltaTime, Space.World);      } 二、Vector3類 (四種) Vector3  既可以表示三維空間中的一個點,也可以表示一個向量。 這三個方法均為插值方法, Lerp 為線性插值, Slerp 為球形插值,  MoveTowards 在 Lerp 的基礎上增加了限制最大速度功能。 當需要從指定A 點移動到 B 點時 , 可以考慮時候這些方法。 1、Vector3.MoveTowards();勻速移動到目标點 void  Update (){          //參數1,自身position。  參數2,目标點position,          //參數3,移動速度,  0不動,>0朝向目标移動, //<0朝向目标點的向量相反方向移動 , 這時,物體隻有運動方向,不再有目标點         transform.position =  Vector3 .MoveTowards ( transform.position,  new   Vector3 ( 0, 0, 5 ) , speed *  Time .deltaTime ) ; } 2、Vector3.Lerp();線性插值 void  Update (){          //參數1,自身position。  參數2,目标點position,          //參數3,移動剩餘距離的百分比距離 ,指派範圍(0,1) 數值越大運動越快         transform.position =  Vector3 .Lerp ( transform.position,  new   Vector3 ( 0, 0.5f, 20 ) , speed ) ; } 3、Vector3.Slerp();球形(弧形)插值 void  Update (){          //參數1,自身position。  參數2,目标點position,          //參數3,移動剩餘距離的百分比距離 ,指派範圍(0,1) 數值越大運動越快         transform.position =  Vector3 .Slerp ( transform.position,  new   Vector3 ( 0, 0.5f, 20 ) , speed ) ; } 注意:因為插值移動需要不止一幀的時間才能到達目标,是以不要把插值移動放到Update中執行,盡量不要設定限制條件。 4、Vector3.SmoothDamp();平滑阻尼 該方法是可以平滑的從A 逐漸移動到 B 點,并且可以控制速度,最常見的用法是相機跟随目标。 public   static  Vector3 SmoothDamp( Vector3 current, //目前物體位置 Vector3 target, //目标位置 ref Vector3 currentVelocity, //目前速度,這個值由你每次調用這個函數時被修改 //雖然使用ref關鍵字,不過函數運作時會自動修改 //一般傳入參數值為0 float smoothTime, //到達目标的大約時間,較小的值将快速到達目标 ,數值越大走的越慢 float maxSpeed = Mathf.Infinity,//選擇允許你限制的最大速度(預設為正無窮) float deltaTime = Time.deltaTime//自上次調用這個函數的時間(預設為Time.deltaTime) ); 例如: using  UnityEngine; public   class   CameraTest2  :  MonoBehaviour {      public   Transform  player;      Vector3  distance;      public   float  speed; Vector3 ve;      void  Start (){         distance = transform.position - player.position;      }      void  LateUpdate (){         transform.position =  Vector3 .SmoothDamp ( transform.position, player.position + distance,  ref  ve, 0 ) ;      } } 三、Rigidbody類 (三種) Rigidbody 元件用于模拟物體的實體狀态,比如物體受重力影響,物體被碰撞後的擊飛等等。 注意: 1、 關于Rigidbody 的調用均應放在 FixedUpdate 方法中,該方法會在每一次執行實體模拟前被調用。 2、使用加速度有兩種方式, (1) 、第一是rigid.velocity += transform.forward * 100; (2) 、第二是rigid.AddForce(transform.forward * speed, ForceMode.Acceleration); 1、Rigidbody.velocity 實體速度 設定剛體速度可以讓物體運動并且忽略靜摩擦力,這會讓物體快速從靜止狀态進入運動狀态。 using  UnityEngine; public   class   MoveTest  :  MonoBehaviour {      Rigidbody  rigid;      void  Start (){         rigid = GetComponent< Rigidbody > () ;      }      void  FixedUpdate (){          //加速運動          //rigid.velocity += transform.forward * 100;          //瞬間速度          //if (Input.GetKeyDown(KeyCode.Space))          //    rigid.velocity = transform.forward * 100;      } } 2、Rigidbody.AddForce();添加力 給剛體添加一個方向的力,這種方式适合模拟物體在外力的作用下的運動狀态。 using  UnityEngine; public   class   MoveTest  :  MonoBehaviour {      Rigidbody  rigid;      public   float  speed;      void  Start (){         rigid = GetComponent< Rigidbody > () ;      }      void  FixedUpdate (){          //添加預設類型的力          //rigid.AddForce(transform.forward * speed);          //ForceMode.Acceleration 向剛性物體增加一個連續的加速度,忽略它的品質。          //rigid.AddForce(transform.forward * speed, ForceMode.Acceleration);          //ForceMode.Force 用它的品質,給剛性體增加一個連續的力。          //rigid.AddForce(transform.forward * speed, ForceMode.Force);          //ForceMode.Impulse 用它的品質,給剛體增加一個瞬間的力。          //rigid.AddForce(transform.forward * speed, ForceMode.Impulse);          //ForceMode.VelocityChange 在剛開始的時候增加一個瞬時速度變化,忽略它的品質。          //rigid.AddForce(transform.forward * speed, ForceMode.VelocityChange);      } } 3、Rigidbody.MovePosition();移動位置 剛體受到實體限制的情況下,移動到指定點。 using  UnityEngine; public   class   MoveTest  :  MonoBehaviour {      Rigidbody  rigid;      public   float  speed;      void  Start (){         rigid = GetComponent< Rigidbody > () ;      } void FixedUpdate(){ //移動到(0,0,1)的位置         rigid.MovePosition ( transform.forward ) ;      } } 四、CharacterController類 (兩種) CharacterController 用于控制第一人稱或第三人稱角色的運動,使用這種方式可以模拟人的一些行為,比如限制角色爬坡的最大斜度 , 步伐的高度等。 1、CharacterController.SimpleMove(); 按m/s 運動,用于模拟簡單運動,并且自動應用重力,傳回值表示角色目前是否着地。 using  UnityEngine; public   class   MoveTest  :  MonoBehaviour {      CharacterController  character; public float speed;      void  Start (){         character = GetComponent< CharacterController > () ;      }      void  FixedUpdate (){         character.SimpleMove ( transform.forward * speed ) ;      } } 2、CharacterController.Move(); 按幀運動,模拟更複雜的運動, 重力需要通過代碼實作,傳回值表示角色與周圍的碰撞資訊。 using  UnityEngine; public   class   MoveTest  :  MonoBehaviour {      CharacterController  character;      public   float  speed;      void  Start (){         character = GetComponent< CharacterController > () ;      }      void  FixedUpdate (){         character.Move ( transform.forward * speed ) ;      } }

繼續閱讀