c# - 用子弹射击时物体不会被摧毁 - UNITY3D C#

标签 c# unity3d

所以在我的游戏中,有一把枪可以发射子弹,我试图让一个游戏对象在与子弹碰撞时销毁。子弹基于一个游戏对象(胶囊)。到目前为止,我已经尝试过这两个脚本:

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

我正在射击物体,但它并没有消失/摧毁自己。我该如何解决这个问题?

如果有帮助,这里有一个视觉效果:Visual

最佳答案

this 指的是调用者的对象实例 ( this is basic OOP ),即 whenshot,而不是 gameObject。因此,第二个示例有效地Destroy脚本实例,来自它所附加的gameObject

第一个脚本在技术上没问题,只要满足这些条件就应该可以工作:

  1. 射弹(子弹)或目标(或两者)都附有非运动学刚体组件。 ( Unity docs. )
  2. 两者都有 3D Collider 组件。
  3. 与目标碰撞的每个子弹游戏对象的名称完全“子弹”。
  4. 所有射弹对象都有这个脚本作为一个组件。

一些建议

使用预制件和标签:获取你的子弹原语并将其存储为预制件。向名为“Bullet”的预制件添加标签。对目标执行相同操作并将其标记为“目标”。将播放器标记为“播放器”。在“gunController”中,设置对子弹预制件的引用,并使其在您使用的任何触发器上实例化子弹。在 bullet 的脚本中,使用 CompareTag("Target") 而不是 == 并销毁目标 gameObject 和 this.gameObject。

在我看来,以上就是你想要的行为。如果是这样的话,碰撞和破坏之间就没有延迟,因此不需要模拟任何物理现象。除非您与子弹/目标有一些其他物理交互,否则将没有刚体的标记为触发器。

强烈建议

完成 Unity 教程。

关于c# - 用子弹射击时物体不会被摧毁 - UNITY3D C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37979818/

相关文章:

c# - 如何解决调用 Amazon SP-API 的问题,即使使用有效的 token 和签名,它也始终返回未经授权

c# - 如何循环并销毁Unity中游戏对象的所有 child ?

xcode - 如何将文件添加到 Xcode 项目? (编写Unity插件)

c# - FB.Logout() 在 Facebook UnitySDK 中不起作用

c# - Unity C# 脚本字典初始化程序不是 C# 4.0 语言规范的一部分

c# - 同步更新调用期间乐观并发异常

c# - web-api POST 正文对象始终为 null

c# - 如何使用 pop3 c# 从 Yahoo mail 中读取最新的电子邮件

c# - EF Code-First 中查找表的最佳实践

c# - 碰撞时的C#解析错误