2016年9月24日 星期六

[Unity] 筆記: 2D物件移動

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)
                         ,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);



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);



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);