Unity Dev Memo (1)
March 8, 2020
Transform.position
Rigidbody.AddForce()
CharacterController.Move()
Transform
是每個 gameObject 都有的屬性,掌管了物體的位置 (position),角度 (rotation) 與大小 (scale) 。這三個屬性都具有 x, y, z 三個子屬性,對 position 你可以使用三維向量 (Vector3) ,對角度可以使用尤拉角 (Eular Angle) 來調整。Transform.position
調整物體位置的語法像是這樣:Transform.position = new Vector3(0, 0, 1);
Vector3 objectPos = Transform.position;
Transform.position = new Vector3(objetPos.x, objectPos.y, objectPos.z + 1);
Transform.position
是強制調整物體位置,有點像是瞬間移動。適合的場合有攝影機等。AddForce
就是基於一個 Vector3 的角度給予外力。Rigidbody.AddForce(new Vector3(0, 0, 10));
CharacterController.Move(new Vector3(0, 0, 1));
CharacterController.Move
比起 Rigidbody.AddForce
更加平滑,且會受碰撞影響,比起 Transform.position
更加自然。Start()
與 Update()
。這兩個函數都是腳本系統的核心之一。Physics.OverlapBox()
達成。這個函數的功用是指定一個中心點與三維距離所建構的立方體,尋找所有進入這個立方體的其他碰撞體 (Collider)。更甚還可以指定 Layer ,將判斷對象限定在特定 Layer 。Is Trigger
。這個選項可以讓該 Collider 不會與其他 Collider 造成碰撞與物理位移,而只會偵測碰撞體之間的重疊並依此觸發事件。具體實作如下:public class AttackController : MonoBehaviour
{
public Collider Hitbox;
public int ATK;
private List<GameObject> hitEnemies = new List<GameObject>();
void Update()
{
DetectAttack(Hitbox);
}
public void ClearHitEnemyList()
{
hitEnemies.Clear();
}
void DetectAttack(Collider hitbox)
{
Collider[] hurtboxes = Physics.OverlapBox(
hitbox.bounds.center, // 中心點
hitbox.bounds.extents, // 三維尺寸
hitbox.transform.rotation, // 三維角度
LayerMask.GetMask("{INSERT LAYER NAME}") // 指定對象 layer
);
// hurtboxed 就是這次攻擊所有被註冊的受攻擊碰撞體
foreach (Collider hurtbox in hurtboxes)
{
GameObject enemy = hurtbox.gameObject;
if (!hitEnemies.Contains(enemy))
{
hitEnemies.Add(enemy);
enemy.doAnythingYouWant(...);
}
}
}
}
ClearHitEnemyList
清空列表即可。enemy
是受到攻擊的 collider 的父物件本身,如果該物件在受到攻擊時呼叫的腳本在該物件身上,等於要從攻擊角色的 hitbox 腳本呼叫另一個物件的腳本,可以使用 .SendMessageUpwards("{INSERT FUNC NAME}", {INSERT FUNC PARAM})
。這個函數可以向上呼叫該腳本父物件的其他函數。