【发布时间】:2016-02-09 15:53:16
【问题描述】:
我想创造一个像地雷一样的东西,这意味着会有一个物体,当有人踩到它时,会发生爆炸,踩到的物体会受到伤害。这部分效果很好,我自己已经能够弄清楚这种行为。
踩到地雷后,物体会正确地自我毁灭。因此,它创造的“爆炸”仍然在这里。更奇怪的是,地雷创造了这个爆炸的多个克隆。这是代码
using UnityEngine;
using System.Collections;
public class Mine : MonoBehaviour {
Transform playerT;
GameObject itself;
// Use this for initialization
void Awake() {
playerT = GameObject.FindGameObjectWithTag ("Player").transform;
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Monster") {
EnemyHealth enemyHeatlh = other.GetComponent<EnemyHealth> ();
enemyHeatlh.Death ();
PyroExplode Pyro = gameObject.AddComponent("PyroExplode") as PyroExplode;
Pyro.setTransform(transform);
Pyro.Generate ();
Destroy (Pyro.gameObject, 1.6f);
Destroy (this.gameObject, 1.6f);
}
}
}
在这段代码中,我实例化了一个新的 PyroExplode,设置了它的转换属性并在他身上调用了 Generate() 方法。这是 Generate() 方法:
public void Generate(){
Instantiate ( Resources.Load ("Pyro1"), mineTransform.position, mineTransform.rotation);
}
这将加载一个带有动画、球体碰撞器和脚本的预制件(脚本正在渲染爆炸效果)。所以现在这就是当有人踩到地雷时会发生的事情!
创建了多个克隆。我一开始以为是因为怪物还在与地雷相撞,因此想起了 OnTriggerEnter() 事件。我试图在我的 OnTriggerEnter() 中将我的对撞机的半径设置为 0,这样它就不会再与其他任何东西发生碰撞,但这没有帮助。此外,如您所见,火焰兵不会被摧毁。我尝试在 PyroExplode 类中调用 Destroy 以查看它是否会有所作为,但它没有。
所以这是我的 2 个问题:
1- 为什么它没有被销毁?
2- 当有东西踩到矿井时,为什么会有超过 1 个火焰兵?
【问题讨论】:
-
你的代码有些奇怪。您在已经进入的组件上添加了一个 PyroExplode 组件,然后您将 PyroExplode 转换设置为 Mine 转换,这些组件已经相同。最后你销毁 Pyro.gameobject 和 Mine.gameobject,它们又是一样的。如果我错了,请纠正我。
-
我将 PyroExplode 的变换设置为与我的 Mine 变换相同以避免潜在的问题,这只是为了确保爆炸的原点与地雷的原点相同(如果有东西降落会很奇怪在矿井上,几米外发生爆炸)。我在 1.6f 之后摧毁了 Pyro 和 Mine,这是动画的长度(这意味着当爆炸消失时,我移除了 Pyro 组件和地雷。Pyro 组件没有被添加到地雷层次结构中,以某种方式它被添加到场景层次结构((这就是你在我的屏幕截图上看到的))
-
您在层次结构中看到的 Pyro 对象是在您的
Generate方法中实例化的对象。您在代码Destroy (Pyro.gameObject);中销毁的那个是与我的相同的游戏对象。这是因为这个Pyrovar 是您在运行时添加到Mine对象的一个新组件。看,在这段代码PyroExplode Pyro = gameObject.AddComponent("PyroExplode") as PyroExplode;中,您正在将一个新的PyroExplode组件添加到相同的对象Mine。所以你打电话给Destroy (Pyro.gameObject);和Destroy (this.gameObject);是没有意义的。 -
因为该上下文中的
Pyro.gameObject和this.gameObject是相同的。另一件事,为了确保OnTriggerEnter不会被多次调用,请在其上放置Debug.log。