(第十章)Unity3D-脚本的碰撞与触发

来源:互联网 发布:windows update卡在35 编辑:程序博客网 时间:2024/06/07 00:28


我们在游戏里经常会看到,某两个物体发生碰撞之后总会出现一些相应的反应,例如一颗子弹发射后,如果射中目标,目标就消失。而这些反应都是有程序员敲代码敲出来的,那么我们在Unity3D里要怎么实现这些功能呢,很简单,Unity3D为我们提供了很多方便的碰撞触发事件。




 Collider.OnTriggerEnter 进入触发器
         当碰撞器other进入触发器时OnTriggerEnter被调用。
         这个消息是发送给触动触发器的碰撞器和刚体(或如果没有刚体的碰撞器)。
 注意:假如一个碰撞物体同时带有一个刚体属性那么只发送这个触发事件。需要勾选isTrigger



Collider.OnCollisionEnter 进入碰撞
        当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用.
        相比OnTriggerEnter,OnCollisionEnter传递Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息。
        在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。
        注意:如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件。


  注意点了isTrigger相当于Collider没用了,rigidbody是基于boxCollider的,没碰撞自然就穿过去了  ,使用OnCollisionEnter时物体不能勾选isTrigger,然而OnTriggerEnter需要勾选


Collider.OnCollisionExit 退出碰撞
     * 当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用
     * 相比OnTriggerExit,OnCollisionExit传递Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息。
     * 在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。注意,如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件。
注意isTrigger不能勾选


这里列出的只有Collider对于的触发器,当然还有MonoBehaviour里面的成员,名字都跟Collider一样,这里也不一个一个列举了,具体请看脚本文档.


好了介绍了这些,当然是要来使用的,那我们来看看怎么使用。

我们在我们Game中创建一些物体我们把他们当做敌人Cube,接着再创建一个shape当做玩家。当然也可以用别的来代替,博主只是图个方便- _-!!.如图



接着我们开始写脚本,这里用c#写,当然也可以用js来写,都一样的。

代码也很简单,这里做的效果是,当玩家靠进敌人时敌人就会消失。
 void OnTriggerEnter(Collider other)   {        Destroy(other.gameObject);    }
里面的参数就是获得碰撞物的结构。
现在将脚本拖到玩家上,然后运行你就会发现,当与敌人碰撞时,敌人叫消失了。
注意:这个地方的is Trigger要勾上。否则就不会触发OntriggerEnter.


我们接下来试试OnCollisionEnter函数
void OnCollisionEnter(Collision collision){<span style="font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"></span>Destroy(</span><span style="font-family: Arial, Helvetica, sans-serif;">collision</span><span style="font-family: Arial, Helvetica, sans-serif;">.gameObject);</span>
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>

这个和上面的那个效果是一样的,只不过is Trigger不能勾选。

然后OnCollisionExit与OnCollisionEnter相反,当物体碰撞后,然后离开就会触发。这里就不再列出代码了。

玩家移动代码
void Update () {if (Input.GetKey(KeyCode.W)){           transform.Translate(new Vector3(0, 0, -0.4f));}        if (Input.GetKey(KeyCode.S))        {            transform.Translate(new Vector3(0, 0, 0.4f));        }        if (Input.GetKey(KeyCode.A))        {            transform.Translate(new Vector3(-0.4f, 0, 0.0f));        }        if (Input.GetKey(KeyCode.D))        {            transform.Translate(new Vector3(0.4f, 0, 0.0f));        }    }
}





0 0
原创粉丝点击