您的位置:首页 > 移动开发 > Unity3D

Unity3d 碰撞检测

2014-02-25 14:35 344 查看
Unity3d 主要由Trigger和Collison 两种碰撞检测:

(1)

检测Trigger:双方都有Collider。双方至少有一个Rigidbody(任意一方都可以),有一个Trigger(任意一方都可以).

若只有一个Rigidbody,则碰撞时,该Rigidbody一定要是运动的。

碰撞后发出的OnTriggerEnter,OnTriggerStay,OnTriggerExit都可以在双方所附加的脚本上接收。其中的参数Collider other是碰撞的另一方的Collider

常用方法如下:
OnTriggerEnter 进入时
OnTriggerExit 离开时
OnTriggerStay 处于时

今天跟这教程做合金弹头,注意到当主角遭受敌人近身刺杀攻击时使用OnTriggerStay 方法,当遭受敌人子弹或炮弹攻击时,采用OnTriggerEnter
方法:

近身刺杀:
void OnTriggerStay(Collider other)

    {

        myTime3 += Time.deltaTime;

        if (myTime3 > 1 && other.tag == "enemy")

        {

            killed = true;

            myTime3 = 0;

            Destroy(other.gameObject);

        }

    }

远程炮弹:

  void OnTriggerEnter(Collider other)

    {

        myCamera=GameObject.Find("Main Camera");  //获取主摄像机,在之后产生音效时在摄像机处产生,以达到音效声音效果更好

        if(other.tag=="gift1")                                           //合金弹头中子弹包

        {

            AudioSource.PlayClipAtPoint(giftSound,new Vector3(myCamera.transform.position.x,0,-10));

            Destroy(other.gameObject);

        }

        if (other.tag == "gift2")                                     //合金弹头中医疗包
       

        {

            AudioSource.PlayClipAtPoint(giftSound, new Vector3(myCamera.transform.position.x, 0, -10));

            Destroy(other.gameObject);

        }
   
  //合金弹头中各种敌人发出的炸弹
        

        if (other.tag == "bombExplosion")

        {

            killed = true;

            Destroy(other.gameObject);

            GameObject enemy2 = GameObject.Find("enemy2");

            Enemy2Controller myEnemy2Controller = enemy2.GetComponent<Enemy2Controller>();

            myEnemy2Controller.SetTime(-3.0f);

          

        }

        else if (other.tag == "jetExplosion")

        {

            killed = true;

            Destroy(other.gameObject,0.5f);

            GameObject myJet = GameObject.Find("jets");

            JetController myJetController = myJet.GetComponent<JetController>();

            myJetController.SetTime(-2.0f);

        }

        else if (other.tag == "tankFire")

        {

            Instantiate(tankFireExplosion, other.transform.position + new Vector3(-0.1f, 0.0f, -0.1f), transform.rotation);

            killed = true;

            Destroy(other.gameObject, 0.5f);

            GameObject myTank = GameObject.Find("tank");

            TankController myTankController = myTank.GetComponent<TankController>();

            myTankController.SetTime(-2.0f);

        }   

}

(2)

检测Collision:双方都没有Trigger。双方至少有一个非kinematic的Rigidbody。

若只有一个Rigidbody,则碰撞时,该Rigidbody一定要是运动的。

碰撞后发出的OnCollisionEnter,OnCollisionStay,OnCollisionExit都可以在双方所附加的脚本上接收。其中的参数Collision collision的各个属性collider,gameObject,rigidbody(若无则为null),transform,均为碰撞另一方的属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息