Unity物件移動
在Unity中,有兩種方式可以使物體移動,一種是對物體施力,而另一種則是直接強制改變座標位置 .利用2D剛體(Rigidbody2D)移動物件 (施力)
Rigidbody2D.AddForce(Vector2 Force,ForceMode2D mode)
對物件的中心(世界座標)施加力量使物件移動,該移動力量會受剛體質量(Mass)跟線性阻力(Linear Drag)以及其接觸到的碰撞器(collider)摩擦係數所影響,也就是說當質量阻力及摩擦係數越大時,所需施加的力量也需要更大.
在方法中的參數Force,是一個二維向量(具有方向的量),在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.
另一個參數ForceMode2D是個ForceMode2D型別的參數,可分為Force及Impulse兩種,在程式中直接以ForceMode2D宣告就可以.
Force mode: 對物件施加具方向性的力,同AddForce基本定義.
Impluse mode: 對物件施加一個脈衝力,該力量一樣具有方向性.
ForceMode2D是optional參數,沒有加入這個參數時,預設就是Force mode.
Script範例:
float horizontal = Input.GetAxis ("Horizontal");
rb2D.AddForce (new Vector2(horizontal,0));
rb2D.AddForce (new Vector2(horizontal,0),ForceMode2D.Force);
rb2D.AddForce (new Vector2(horizontal,0),ForceMode2D.Impulse);
Rigidbody2D.AddForceAtPosition(Vector2 Force, Vector2 Position, ForceMode mode)
從世界座標中的特定位置(Position)與物件中心形成一個虛擬力矩,然後對特定位置施加力量造成物件移動同時也產生扭力使物件旋轉,移動力量跟AddForce一樣會受質量跟阻力及碰撞器摩擦係數影響,而旋轉的扭力會受到角度阻力(Angular Drag)所影響.
在方法中的參數Force,是一個二維向量(具有方向的量),在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.
Position也是一個二維向量,不過在這邊只用來表示位置,並不具方向性,在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.
ForceMode2D的部分與AddForce中一樣.
Script範例:
float horizontal = Input.GetAxis ("Horizontal");
rb2D.AddForceAtPosition (new Vector2(horizontal,0),new Vector2(-1f,1f))
rb2D.AddForceAtPosition (new Vector2(horizontal,0),new Vector2(-1f,1f))
rb2D.AddForceAtPosition (new Vector2(horizontal,0),new Vector2(-1f,1f)
,ForceMode2D.Force);
rb2D.AddForceAtPosition (new Vector2(horizontal,0),new Vector2(-1f,1f)
,ForceMode2D.Impulse);
Rigidbody2D.AddRelativeForce(Vector2 Force, ForceMode mode)
與AddForce作用相同,唯一不同的是AddForce, AddForceAtPosition都是對世界座標系統作用,而AddRelativeForce則是對本地座標系統作用.下圖左方為物件旋轉前,右圖為旋轉後,當物件旋轉後,本地座標會跟著旋轉,此時施力方向與旋轉前就不一樣了.
在方法中的參數Force,是一個二維向量(具有方向的量),在程式中可以用 new Vector(x,y)來宣告,其中x,y都是float.
另一個參數ForceMode2D是個ForceMode2D型別的參數,可分為Force及Impulse兩種,在程式中直接以ForceMode2D宣告就可以.
ForceMode2D的部分與AddForce中一樣.
Script範例
float horizontal = Input.GetAxis ("Horizontal");
rb2D.AddRelativeForce (new Vector2 (horizontal, 0));
rb2D.AddRelativeForce (new Vector2 (horizontal, 0), ForceMode2D.Force);
rb2D.AddRelativeForce (new Vector2 (horizontal, 0), ForceMode2D.Impulse);
rb2D.AddRelativeForce (new Vector2 (horizontal, 0), ForceMode2D.Force);
rb2D.AddRelativeForce (new Vector2 (horizontal, 0), ForceMode2D.Impulse);
Rigidbody2D.AddTorque(float torque, ForceMode2D mode)
對物件的世界座標中心Z軸(因為是2D平面)施加扭力,torque > 0 時,會逆時針扭動,反之則順時針扭動.
在方法中的參數Torque,是float.
ForceMode2D的部分與AddForce中一樣.
Script範例
float horizontal = Input.GetAxis ("Horizontal");
rb2D.AddTorque (horizontal*2);
rb2D.AddTorque (horizontal*2 , ForceMode2D.Force);
rb2D.AddTorque (horizontal*2 , ForceMode2D.Impulse);
rb2D.AddTorque (horizontal*2 , ForceMode2D.Force);
rb2D.AddTorque (horizontal*2 , ForceMode2D.Impulse);
Rigidbody2D.MovePosition(Vector2 Position)
透過將物件直接位移到指定位置達到移動的效果,不受剛體其他參數影響.
Rigidbody2D.MoveRotation(float Angular)
透過改變物件角度達到旋轉的效果,不受剛體其他參數影響,Angular > 0 時,物件旋轉方向為逆時針,反之為順時針.
利用Transform移動物件 (改變座標)
Transform是每個物件都會有的元件,其中包含了物件的位置(Postion),旋轉角度(Rotation)以及大小(Scale).
transform.position
改變或取得物件座標,回傳及代入值皆為三維向量(Vector3),在處理2D物件時,記得保持z軸座標.
Script範例
Debug.Log(transform.position); //印出物件目前位置
transform.position = new Vector3(1,1,0); //給予物件新的位置
transform.position.set(float x, float y, float z)
改變物件座標,直接給定三個軸向的位置即可.
Script範例
transform.position.set(1,2,0);
transform.position.axis
用來取得物件位置的某個軸向數值,取得的數值為float型態.
Script範例
float x = transform.position.x;
float y = transform.position.y;
float z = transform.position.z;
transform.rotation
改變或取得物件的旋轉參數,回傳及代入值皆為四元數(Quaternion).
Script範例
Debug.Log(transform.rotation);
transform.rotation = Quaternion.Euler(1,1,1);
transform.rotation = Quaternion.Euler(new Vector3(1,1,1));
transform.RotateAround(Vector3 Point, Vector3 Axis, float Angle)
使物件針對某個點(Point)上的某個軸(Axis)旋轉,Point及Axis皆為三維向量,Angle為float.
Script範例
transform.RotateAround (new Vector3 (1, 1, 0), new Vector3 (0, 0, 1), horizontal);