我使用unity3d c#在特定位置销毁对象后重新生成对象。以下代码返回错误消息:
四分之一到矩阵转换失败,因为输入四元数无效
我得到预制件的多次产生几秒钟后出现错误信息,它们会在整个屏幕上产生。
我的代码如下。对于变量respawn,我从Unity本身拖放预制件。谢谢你的指导。
Transform initialSpawn;
Transform respawn;
public static bool dead = false;
void Start()
{
initialSpawn = Instantiate(respawn, new Vector3(0,7,0), Quaternion.identity) as Transform;
initialSpawn.parent = transform;
}
void Update () {
if (dead == true)
{
//The line below is the one giving the error
initialSpawn = Instantiate(respawn, new Vector3(4, 7, 0), Quaternion.identity) as Transform;
initialSpawn.parent = transform;
StartCoroutine(pauseBeforeReSpawn(2));
dead = false;
Debug.Log("test working");
}
void OnTriggerEnter(Collider c)
{
if(c.gameObject.name =="barrel" || c.gameObject.name == "ground")
{
Destroy(initialSpawn);
dead = true;
}
}
IEnumerator pauseBeforeReSpawn(int seconds)
{
yield return new WaitForSeconds(seconds);
}
这是一个杀死对象的单独类:
public class PlayerManager : MonoBehaviour {
void Update () {
}
void OnTriggerEnter(Collider enter)
{
if (enter.collider.gameObject.CompareTag("fruit"))
{
ScoreCounter.counter += 10;
Destroy(enter.gameObject);
}
}
}
答案 0 :(得分:1)
我注意到的一些问题:
协程放置错误,什么都不做。或者至少它不能做你想做的事。
Destroy()
不会破坏同一帧中的对象。因此,您的Update
可能会被搞砸,因为对象即将被销毁,但您仍在尝试更改变量initialSpawn
所引用的内容。
public static bool dead = false;
如果您拥有多个实例,这将导致此对象的所有实例死亡。您应该考虑删除static
关键字。
我认为解决第一个问题也将解决第二个问题。以下是您可以尝试的内容:
public float respawnTimeOut = 2F;
public static bool dead = false;
private float timeSinceDeath = 0F;
private Transform initialSpawn;
private Transform respawn;
void Start()
{
initialSpawn = Instantiate(respawn, new Vector3(0,7,0), Quaternion.identity) as Transform;
initialSpawn.parent = transform;
}
void Update ()
{
if (dead)
{
if(timeSinceDeath >= respawnTimeOut)
{
initialSpawn = Instantiate(respawn, new Vector3(4, 7, 0), Quaternion.identity) as Transform;
initialSpawn.parent = transform;
dead = false;
timeSinceDeath = 0F;
Debug.Log("test working");
}
else
{
// Update death timer
timeSinceDeath += Time.deltaTime;
}
}
}
void OnTriggerEnter(Collider c)
{
if(c.gameObject.name =="barrel" || c.gameObject.name == "ground")
{
Destroy(initialSpawn);
dead = true;
}
}
答案 1 :(得分:1)
试试这个:
void OnTriggerEnter(Collider c)
{
if(!dead && (c.gameObject.name =="barrel" || c.gameObject.name == "ground"))
{
Destroy(initialSpawn);
dead = true;
}
}
我将这与Alex的变化相结合,因为我不太喜欢那里的Coroutine的外观。