Unity3.X 筆記01

碰撞檢測的三種方法:

碰撞器檢測
在門和玩家分別設置碰撞器
使用角色控制器碰撞器 函數: 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");
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章