Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一破坏和怪异行为(多克隆)_C#_Unity3d_Unity5 - Fatal编程技术网

C# 统一破坏和怪异行为(多克隆)

C# 统一破坏和怪异行为(多克隆),c#,unity3d,unity5,C#,Unity3d,Unity5,我想创造一种类似地雷的东西,这意味着会有一个物体,当有人踩到它时,会发生爆炸,踩到的物体会受到伤害。这部分效果很好,我已经能够自己弄清楚这种行为 踩到地雷后,物体会自行毁灭。因此,它制造的“爆炸”仍留在这里。更奇怪的是,地雷制造了这次爆炸的多个克隆体。这是密码 using UnityEngine; using System.Collections; public class Mine : MonoBehaviour { Transform playerT; GameObjec

我想创造一种类似地雷的东西,这意味着会有一个物体,当有人踩到它时,会发生爆炸,踩到的物体会受到伤害。这部分效果很好,我已经能够自己弄清楚这种行为

踩到地雷后,物体会自行毁灭。因此,它制造的“爆炸”仍留在这里。更奇怪的是,地雷制造了这次爆炸的多个克隆体。这是密码

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);

        }
    }
}
它将加载一个带有动画、球体碰撞器和附加到其上的脚本的预设(脚本正在渲染爆炸效果)。这就是当有人踩到地雷时发生的事情

创建多个克隆。我最初认为这是因为怪物仍在与矿井发生碰撞,从而回忆起OnTriggerEnter()事件。我已经尝试在OnTiggerEnter()中将碰撞器的半径设置为0,这样它就不会再与任何其他对象碰撞,但这没有任何帮助。而且,正如你所看到的,火焰不会被摧毁。我试着在PyroExplode类中调用Destroy,看看它是否会产生影响,但没有

下面是我的两个问题:

1-为什么它不被销毁?

2-为什么有东西踩在地雷上时会有不止一个火焰?

我认为,既然你有一个球体碰撞器,那么另一个物体进入时会在多个点上碰撞。考虑两个球体碰撞,为了使发动机报告碰撞,两个项目需要重叠。如果你有两个球体,至少有4个接触点,那么这四个球体需要进入。立方体也是如此。如果碰撞器更复杂,可能会有更多的调用

您可以尝试阻止多次呼叫:

private bool sentinel = false;
void OnTriggerEnter(Collider col){
    if(this.sentinel == true){ return; }
    this.sentinel = true;
    // rest of the code
}

我认为,因为你有一个球体碰撞器,另一个物体在进入时会在很多点上碰撞。考虑两个球体碰撞,为了使发动机报告碰撞,两个项目需要重叠。如果你有两个球体,至少有4个接触点,那么这四个球体需要进入。立方体也是如此。如果碰撞器更复杂,可能会有更多的调用

您可以尝试阻止多次呼叫:

private bool sentinel = false;
void OnTriggerEnter(Collider col){
    if(this.sentinel == true){ return; }
    this.sentinel = true;
    // rest of the code
}

你的代码有点奇怪。您将在已添加到的组件处添加一个PyroExplode组件,然后将PyroExplode转换设置为Mine转换,这是相同的。最后你摧毁了Pyro.gameobject和Mine.gameobject,它们又是一样的。如果我错了,请纠正我。我将PyroExplode的变换设置为与Mine变换相同,以避免潜在问题,这只是为了确保爆炸源与Mine原点相同(如果有东西落在地雷上并且几米外发生爆炸,这会很奇怪)。我在1.6f后销毁了Pyro和地雷,这是动画的长度(这意味着当爆炸消失时,我移除了Pyro组件和地雷。Pyro组件没有添加到地雷层次结构中,不知怎的,它添加到了场景层次结构中((这是我的屏幕截图上看到的)))在层次结构中看到的Pyro对象是在
Generate
方法中实例化的对象。在代码
destroy(Pyro.gameObject)中销毁的一个
和我的是同一个游戏对象。这是因为这个
Pyro
var是您在运行时添加到
Mine
对象的新组件。看,在这个代码中,PyroExplode Pyro=gameObject.AddComponent(“PyroExplode”)作为PyroExplode您正在将一个新的
PyroExplode
组件添加到与
地雷
相同的对象中。所以你调用
Destroy(Pyro.gameObject)是没有意义的
销毁(这个游戏对象)
。因为该上下文中的
Pyro.gameObject
this.gameObject
是相同的。另一件事,为了确保
OnTriggerEnter
不会被多次调用,请在其上放置一个
Debug.log
。代码中有一些奇怪的东西。您将在已添加到的组件处添加一个PyroExplode组件,然后将PyroExplode转换设置为Mine转换,这是相同的。最后你摧毁了Pyro.gameobject和Mine.gameobject,它们又是一样的。如果我错了,请纠正我。我将PyroExplode的变换设置为与Mine变换相同,以避免潜在问题,这只是为了确保爆炸源与Mine原点相同(如果有东西落在地雷上并且几米外发生爆炸,这会很奇怪)。我在1.6f后销毁了Pyro和地雷,这是动画的长度(这意味着当爆炸消失时,我移除了Pyro组件和地雷。Pyro组件没有添加到地雷层次结构中,不知怎的,它添加到了场景层次结构中((这是我的屏幕截图上看到的)))在层次结构中看到的Pyro对象是在
Generate
方法中实例化的对象。在代码
destroy(Pyro.gameObject)中销毁的一个
和我的是同一个游戏对象。这是因为这个
Pyro
var是您在运行时添加到
Mine
对象的新组件。看,在这个代码中,PyroExplode Pyro=gameObject.AddComponent(“PyroExplode”)作为PyroExplode
您正在将一个新的
PyroExplode
组件添加到与
地雷
相同的对象中。所以你调用
Destroy(Pyro.gameObject)是没有意义的
销毁(这个游戏对象)
。因为该上下文中的
Pyro.gameObject
this.gameObject
是相同的。另一件事,为了确保
OnTriggerEnter
不会被多次调用,请在其上放置
Debug.log