Unity3d 统一-如何在摧毁后重生一个游戏对象
我用unity开发我的游戏。我创造了一个简单的游戏,就像足球一样。进球后,球应该被摧毁,然后重新出现在原来的位置 我已将此脚本附加到我的目标对象Unity3d 统一-如何在摧毁后重生一个游戏对象,unity3d,unityscript,Unity3d,Unityscript,我用unity开发我的游戏。我创造了一个简单的游戏,就像足球一样。进球后,球应该被摧毁,然后重新出现在原来的位置 我已将此脚本附加到我的目标对象 public GameObject ball; Vector3 ballPosition = new Vector3 (4.51f,0.10f,-3.78f); void OnTriggerEnter(Collider other) { StartCoroutine ("RespwanBall"); } IE
public GameObject ball;
Vector3 ballPosition = new Vector3 (4.51f,0.10f,-3.78f);
void OnTriggerEnter(Collider other)
{
StartCoroutine ("RespwanBall");
}
IEnumerator RespwanBall() {
GameObject clone = (GameObject)Instantiate (ball, ballPosition, Quaternion.identity) as GameObject;
Destroy (ball.gameObject);
yield return null;
}
但这只是第一次起作用。然后在第二次销毁之后,它会给出一个错误,表示该对象已被删除,并且您正在尝试访问一个已删除的对象或类似的内容。如果我在OntriggerEnter
函数中使用destroy函数,它在第一次碰撞时会给出相同的错误
我怎么做?请帮忙
谢谢。您正试图访问已删除的对象,因为您将脚本附加到球门上,并且始终删除球,而您的克隆永远不会成为球(因此它始终是同一个球) 如果脚本附加到球上,那么它就可以工作,因为在这种情况下,
ball
将是它自己,因此销毁方法将始终在活动球中激活
如果要将其附加到球门,请确保将克隆更新为活动球:
IEnumerator RespwanBall() {
Destroy (ball.gameObject);
ball = (GameObject)Instantiate (ball, ballPosition, Quaternion.identity);
yield return null;
}
此外,BlueRaja的评论是可以用来改进代码的重要内容:
ball.GameObject
可以是ball
,因为ball
是一个GameObject
李>
您可以使用此脚本尝试重新启用对象-
使用UnityEngine;
使用系统集合;
公共类副本:MonoBehavior
{
[序列化字段]
private GameObject prefable=null;//在编辑器中将多维数据集预制分配给此
void Start()
{
//不需要本地预置变量,也不需要调用Resources.Load();
对于(int i=0;i<4;++i)
{
实例化(预置,新向量3(0,i*10,0),四元数.identity);//您可以在实例化中直接分配位置
}
}
}
这有很多问题。。。1. <代码>球。游戏对象应该是ball
2。您正在从Instantiate
两次3中强制转换结果。respanball
没有理由成为协同程序4。您从未将ball
设置为clone
5。你错贴了“重生”:@BlueRaja DannyPflughoeft Thanx,因为你指出了所有这些错误。我真的应该努力。Thanx很多。@BlueRaja DannyPflughoeft你能详细说明第四步的修正吗。ThankYou@BlueRaja谢谢你的编辑,我只是复制了他的代码,没有注意到!我已经用BlueRaja建议的更正尝试了你的代码。现在它甚至没有破坏这个物体。很抱歉之前的评论。我已经试过你的代码,现在它给我第一次重生后相同的错误。将其连接到目标对象。当我将其连接到球时,它起作用。谢谢,但仍然想知道它是否附加到目标的方法。@AshishBeuwria如果要将其附加到目标,请确保通过执行ball=(GameObject)实例化将克隆更新为活动球。。。
You can try respawning the object by using this script -
using UnityEngine;
using System.Collections;
public class copy : MonoBehaviour
{
[SerializeField]
private GameObject prefab = null; // assign Cube prefab to this in Editor
void Start()
{
// no need for a local prefab variable, nor a call to Resources.Load();
for (int i = 0; i < 4; ++i)
{
Instantiate(prefab, new Vector3(0, i * 10, 0), Quaternion.identity); // you can directly assign position in Instantiate
}
}
}