用子弹射击时物体不会被摧毁 - UNITY3D C#
Object not being destroyed when shot with a bullet - UNITY3D C#
所以在我的游戏中,有一把发射子弹的枪,我试图让一个游戏对象在与子弹碰撞时销毁。子弹基于一个游戏对象(胶囊)。到目前为止,我已经尝试过这两个脚本:
using UnityEngine;
using System.Collections;
public class whenshot : MonoBehaviour {
void OnCollisionEnter(Collision col)
{
if (col.gameObject.name == "Bullet")
{
Destroy(col.gameObject);
}
}
}
和:
using UnityEngine;
using System.Collections;
public class whenshot : MonoBehaviour {
void OnCollisionEnter(Collision col)
{
if (col.gameObject.name == "Bullet")
{
Destroy(this); //the difference between the two is that I changed "col.gameObject" to "this"
}
}
}
我正在拍摄物体,但它不是 disappearing/destroying 本身。我该如何解决这个问题?
如果有帮助,请看这里:
这是我不久前制作的 2D 游戏中的示例,但我认为它可能有所帮助。
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Destroyable")
{
Destroy(other.gameObject);
}
}
当玩家多次射击某些方块时,我用它来摧毁它们,只需将它们切换到 3D 碰撞器和触发器,但它应该对你有用(我希望 ^^)。
编辑:此脚本应附加到您的子弹预制件中
this
指的是调用者 (this is basic OOP) 的对象实例,即 whenshot
,而不是 gameObject
。因此,第二个示例实际上是 Destroy
从它所附加的 gameObject
中获取脚本实例。
第一个脚本在技术上很好,应该可以工作,前提是满足以下条件:
- 射弹(子弹)或目标(或两者)都附有非运动学刚体组件。 (Unity docs.)
- 两者都有 3D Collider 组件。
- 与目标碰撞的每个子弹游戏对象的名称是完全"Bullet"。
- 所有射弹对象都有这个脚本作为组件。
一些建议
使用预制件和标签:获取你的子弹原语并将其存储为预制件。向名为 "Bullet" 的预制件添加标签。对目标执行相同操作并将其标记为 "Target"。将玩家标记为 "Player"。在 "gunController" 中,设置对子弹预制件的引用,并使其在您使用的任何触发器上实例化子弹。在 bullet 的脚本中,使用 CompareTag("Target")
而不是 ==
并销毁目标 gameObject 和 this.gameObject.
在我看来,以上就是你想要的行为。如果是这样的话,碰撞和破坏之间就没有延迟,因此不需要模拟任何物理现象。除非你与 bullets/targets 有一些其他物理交互,否则将没有刚体的标记为触发器。
强烈建议
完成 Unity 教程。
好吧,我明白了,这有点奇怪,但显然我让子弹移动得太快了……我不得不将 "Bullet_Forward_Force" 的浮动速度减慢到大约 150f 才能让它发挥作用。感谢所有回答的人。
我不能评论所以我会做一个回答:
你可以让子弹跑得更快,只需将碰撞检测设置为连续动态即可。
它的成功率接近 %100。
所以在我的游戏中,有一把发射子弹的枪,我试图让一个游戏对象在与子弹碰撞时销毁。子弹基于一个游戏对象(胶囊)。到目前为止,我已经尝试过这两个脚本:
using UnityEngine;
using System.Collections;
public class whenshot : MonoBehaviour {
void OnCollisionEnter(Collision col)
{
if (col.gameObject.name == "Bullet")
{
Destroy(col.gameObject);
}
}
}
和:
using UnityEngine;
using System.Collections;
public class whenshot : MonoBehaviour {
void OnCollisionEnter(Collision col)
{
if (col.gameObject.name == "Bullet")
{
Destroy(this); //the difference between the two is that I changed "col.gameObject" to "this"
}
}
}
我正在拍摄物体,但它不是 disappearing/destroying 本身。我该如何解决这个问题?
如果有帮助,请看这里:
这是我不久前制作的 2D 游戏中的示例,但我认为它可能有所帮助。
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Destroyable")
{
Destroy(other.gameObject);
}
}
当玩家多次射击某些方块时,我用它来摧毁它们,只需将它们切换到 3D 碰撞器和触发器,但它应该对你有用(我希望 ^^)。
编辑:此脚本应附加到您的子弹预制件中
this
指的是调用者 (this is basic OOP) 的对象实例,即 whenshot
,而不是 gameObject
。因此,第二个示例实际上是 Destroy
从它所附加的 gameObject
中获取脚本实例。
第一个脚本在技术上很好,应该可以工作,前提是满足以下条件:
- 射弹(子弹)或目标(或两者)都附有非运动学刚体组件。 (Unity docs.)
- 两者都有 3D Collider 组件。
- 与目标碰撞的每个子弹游戏对象的名称是完全"Bullet"。
- 所有射弹对象都有这个脚本作为组件。
一些建议
使用预制件和标签:获取你的子弹原语并将其存储为预制件。向名为 "Bullet" 的预制件添加标签。对目标执行相同操作并将其标记为 "Target"。将玩家标记为 "Player"。在 "gunController" 中,设置对子弹预制件的引用,并使其在您使用的任何触发器上实例化子弹。在 bullet 的脚本中,使用 CompareTag("Target")
而不是 ==
并销毁目标 gameObject 和 this.gameObject.
在我看来,以上就是你想要的行为。如果是这样的话,碰撞和破坏之间就没有延迟,因此不需要模拟任何物理现象。除非你与 bullets/targets 有一些其他物理交互,否则将没有刚体的标记为触发器。
强烈建议
完成 Unity 教程。
好吧,我明白了,这有点奇怪,但显然我让子弹移动得太快了……我不得不将 "Bullet_Forward_Force" 的浮动速度减慢到大约 150f 才能让它发挥作用。感谢所有回答的人。
我不能评论所以我会做一个回答:
你可以让子弹跑得更快,只需将碰撞检测设置为连续动态即可。
它的成功率接近 %100。