碰撞检测的三种方法:
碰撞器检测
在门和玩家分别设置碰撞器
使用角色控制器碰撞器 函数: 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");
}
}