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,均为碰撞另一方的属性。
(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,均为碰撞另一方的属性。
相关文章推荐
- Kinect结合Unity3D引擎开发体感游戏(一)
- 我是运营,我没有假期
- 在 Linux 中如何移动文件
- 新一代iPad适配应用之游戏篇
- 用vbscript实现隐藏任务栏图标的脚本
- 用autoit编写第一个脚本(Hello World)
- VBS调用WMI快速关闭IE的脚本
- 收集的ROS防火墙脚本
- JSP脚本漏洞面面观
- 不错的批处理脚本 第一部分
- 鼠标触发移动的分层菜单 层菜单moveMenu
- VBS脚本加密/解密VBS脚本(简易免杀版1.1)
- 不错的批处理脚本实例代码 第二部分
- 使用脚本和批处理清除电脑中的痕迹的代码第1/2页
- 让你的脚本说话
- 批量文件查找替换功能的vbs脚本
- 脚本 MsAgent组件 微软精灵 揪出系统自带的宠物
- 百度空间备份脚本baidublogbak.vbs代码分析
- 关于脚本调用外部对像和类型库