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");
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值