碰撞檢測的三種方法:
碰撞器檢測
在門和玩家分別設置碰撞器
使用角色控制器碰撞器 函數: OnControllerColliderHit()
這個碰撞檢測函數包含角色控制器組件,它的唯一參數hit是一個ControllerColliderHit類型變量,通過使用hit包含的信息,來獲知玩家和哪一個物體發生了碰撞。
步驟:
1.給門添加box_collider, 設置門的tag爲 playerDoor
2.角色控制器上增加腳本,在腳本中添加變量
private bool doorIsOpen;
private float doorTimer=0.0f;
public float door openTime = 3.0f;
public AudioClip doorOpenSound, doorShutSound;
3.檢測hit裏的碰撞信息 和 門的開關狀態, 執行方法OpenDoor()
void OnControllerColliderHit(ControllerColliderHit hit)
{
if(hit.gameObject.tag == "playerDoor" && doorIsOpen == false)
{
currentDoor = hit.gameObject;
OpenDoor(currentDoor);
}
}
4.定義OpenDoor方法: 更改門的狀態,播放開門動畫,播放開門聲音
void OpenDoor(GameObject door)
{
doorIsOpen = true;
door.GetComponent<AudioSource>().PlayOneShot(doorOpenSound);
door.transform.parent.GetComponent<Animation>().Play("doorOpen");
}
5.在update方法中設置門自動關閉
void Update()
{
if(doorIsOpen)
{
doorTimer += Time.deltaTime;
if(doorTimer > doorOpenTime)
{
ShutDoor(currentDoor);
}
}
}
6.定義ShutDoor方法
void ShutDoor(GameObject door)
{
doorIsOpen = false;
door.GetComponent<AudioSource>().PlayOneShot(doorShutSound);
door.transform.parent.GetComponent<Animation>().Play("doorShut");
}
*Audio Source組件的引用
4個函數:Play() Stop() Pause() PlayOneShot()
音頻文件的類: AudioClip
AudioClip doorOpenSound;
door.GetComponent<AudioSource>().PlayOneShot(doorOpenSound);
音頻文件的賦值:將音頻文件拖動到公有變量DoorOpenSound上*
光線投射
將門的動畫管理,聲音管理腳本放在門上 DoorManager
將光線投射檢測腳本放在角色上 PlayerCollisions
一旦角色檢測到約定範圍內的光線碰撞,通過SendMessage函數直接調用門腳本中的doorcheck函數
Physics.Raycast()函數
void Update()
{
RaycastHit hit;
if(Physics.Raycast(transform.postion, transform.forward, out hit, 3))
{
if(hit.collider.gameObject.tag == "playerDoor")
{
currentDoor = hit.collider.gameObject;
currentDoor.SendMessage("DoorCheck");
}
}
}
觸發器
在門的父物體上添加碰撞器,設置成trigger(觸發模式)檢測玩家是否進入觸發區域。TriggerZone腳本設置在door的父物體上。
void OnTriggerEnter(Collider col)
{
if(col.gameObject.tag== "Player")
{
transform.FindChild("door").SendMessage("DoorCheck");
}
}