Unity Instantiated Object Script不重复?

时间:2015-12-27 01:57:35

标签: javascript c# unity3d

好的我很好...... 2个问题

我的第一个问题: 如果我实例化一个对象,那么脚本会保留在它上面,并且脚本会像游戏开始时那样开始。

我的第二个问题: 我实例化了我的对象,但我不断收到此错误

UnassignedReferenceException:尚未分配GreenGoUp的变量目标。 您可能需要在检查器中分配GreenGoUp脚本的目标变量。 GreenGoUp.Update()(在Assets / Resources / Scripts / GreenGoUp.cs:23)

基本上我可以说我有信封(它是对象),我将我的对象(这是一个预制件)放入触发器中,当它触及触发器时,对象被销毁...然后我实例化对象回到它的起始位置,但如果我试图再次将我的物体扔到触发器上。什么都没发生。

问题是我在maincamera中有一个脚本,它执行随机范围并将其放入变量中,并根据数字运行脚本。我现在为其中一个信封显示我的脚本。

MainCamera脚本

using UnityEngine;
using System.Collections;

public class RandomFunction : MonoBehaviour {

    int n;
    public GameObject blueObject= null;
    public GameObject greenObject= null;
    public GameObject yellowObject= null;
    public GameObject redObject= null;
    public GameObject orangeObject= null;
    public GameObject purpleObject= null;

    void Start () 
    {
        n=Random.Range(0,1);

        switch(n)
        {
        case 0:

            greenObject.GetComponent<GreenGoUp> ().enabled = true;
            Debug.Log ("GreenGoUp Should be Working");
            break;
        }
    }
}

其中一个信封的脚本

using UnityEngine;
using System.Collections;

public class GreenEnvelope : MonoBehaviour
{
    bool isMove = false;
    public float speed = 40;
    Vector3 targetPosition;
    Vector3 currentPosition;
    Vector3 directionOfTravel ;
    public Transform target;
    public GameObject playerObject;
    GameObject Green=null;
    //public GameObject playerObject;


    void Start()
    {
        playerObject.GetComponent<OnTrig>().enabled=true;
        Debug.Log ("GreenEnvelope is now on, I should be moving");
    }

    void Update()
    {
        Debug.Log ("GreenEnvelope is now moving");
        targetPosition = target.transform.position; // Get position of object B
        currentPosition = this.transform.position; // Get position of object A
        directionOfTravel = targetPosition - currentPosition;
        if (Vector3.Distance (currentPosition, targetPosition) > .2f) {
            this.transform.Translate (
                (directionOfTravel.x * speed * Time.deltaTime),
                (directionOfTravel.y * speed * Time.deltaTime),
                (directionOfTravel.z * speed * Time.deltaTime),
                Space.World);
            transform.Rotate (new Vector3 (Time.deltaTime * 400, 0, 0));
        } 
        }
}

此脚本稍微抬起信封,以便可以向用户显示,以便他可以扔掉它

using UnityEngine;
using System.Collections;

public class GreenGoUp : MonoBehaviour {

    Vector3 targetPosition;
    Vector3 currentPosition;
    Vector3 directionOfTravel;
    public Transform target;

    //public GameObject playerObject;
    public float speed = 40;



    void Start () {
        Debug.Log ("GreenGoUp IS WORKING");
    }


    void Update () {
        Debug.Log ("GreenGoUp IS GOING UP");
        targetPosition = target.transform.position; // Get position of object B
        currentPosition = this.transform.position; // Get position of object A
        directionOfTravel = targetPosition - currentPosition;
        if (Vector3.Distance (currentPosition, targetPosition) > .1f) {
            this.transform.Translate (
                (directionOfTravel.x * speed * Time.deltaTime),
                (directionOfTravel.y * speed * Time.deltaTime),
                (directionOfTravel.z * speed * Time.deltaTime),
                Space.World);
        } 
    }
}

此脚本位于触发器上,用于销毁对象

using UnityEngine;
using System.Collections;

public class OnTrig : MonoBehaviour {

    ParticleSystem particle;
    public GameObject playerObject;
    public GameObject greenDestroy;
    bool isMove=false;
    public GameObject Purple;
    public GameObject Green;
    public GameObject Blue;
    public GameObject Red;
    public GameObject Orange;
    public GameObject Yellow;
    public GameObject mainCamera;



    void OnTriggerEnter(Collider col)
    {
         if(col.gameObject.tag == "Green")
        {
            Destroy(col.gameObject);
            Debug.Log ("GreenEnvelope Has Been Destroyed");
            Green = Instantiate(Resources.Load("Prefabs/greenEnvelope"),new Vector3(-11.63f,-10.49f,30.09f), Quaternion.identity) as GameObject;
            mainCamera.GetComponent<RandomFunction>().enabled=true;

        }
    }
    void OnMouseDown()
    {
        if (Input.GetMouseButtonDown (0)) {
            isMove = true;
        }

        if (isMove == true) {
            playerObject.GetComponent<GreenEnvelope> ().enabled = true;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我无法回答问题#1。但是对于问题#2来修复错误,你必须为GreenGoUp分配对象。就像这个人没有在这张照片中分配视力一样:image

答案 1 :(得分:0)

答案1:

是的,在实例化预制件后,所有脚本及其值都将被复制到实例中。但是,如果您要实例化运行时对象(例如,您之前实例化的对象),则可能会遇到意外情况,因为新实例将复制已初始化对象中的所有值,然后尝试初始化它,这可能会产生不一致状态。

答案2:

我假设您将绿色,蓝色等对象作为场景中预制件的实例。对于这些情况,您可以设置&#34; target&#34;绿色(/蓝色/红色)GoUp脚本的字段到另一个场景对象。

到目前为止一切顺利。游戏将运行并运行,直到您的绿色场景对象被销毁并重新实例化。 Instantiate()将创建一个绿色预制件的新实例,而不是&#34; target&#34;正在设置,因为Prefabs无法保存对场景对象的引用。

你必须重新分配&#34;目标&#34;在实例化你的对象之后。