Unity3.X 笔记01

来源:互联网 发布:水彩 水粉 油画 知乎 编辑:程序博客网 时间:2024/05/16 14:09

碰撞检测的三种方法:

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