2015-12-04 2 views
4

Я не знаю, что я делаю неправильно, это 2D-проект, есть два объекта. Один имеет компонент RigidBody2D и BoxCollider2D. Второй объект имеет только BoxCollider2D. И внизу есть кнопка при нажатии кнопки Object1 осенью на Object2 и Destroy и InstantiateObject1 еще раз. Но когда Object1 Instantiate, то нажмите кнопку не работает. И пришла ошибка вот так:Нажатие кнопки не работает

The object of type Rigidbody2D has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

Объект 1:

enter image description here

Объект 2:

enter image description here

Кнопка Click:

enter image description here

Объекта 1 Автор сценарий:

public class Object1 : MonoBehaviour { 

    public static Object1 instance; 

    [SerializeField] 
    private Rigidbody2D body; 

    [SerializeField] 
    private bool hasdropped; 

    [SerializeField] 
    private bool click; 

    [SerializeField] 
    private float PointerPos; 

    [SerializeField] 
    private float BorderX; 

    void Awake(){ 

     if (instance == null) { 

      instance = this; 
     } 

     //take width of screen 
     Vector3 gameScreen = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height,0)); 

     BorderX = gameScreen.x - 0.6f; 




     body.isKinematic = true; 
     click = true; 
     hasdropped = true; 


    } 



    void FixedUpdate() { 

     if (click) { 

      Vector3 temp = transform.position; 

      PointerPos = Camera.main.ScreenToWorldPoint(Input.mousePosition).x; 

      temp.x = Mathf.Clamp(PointerPos,-BorderX,BorderX); 

      body.position = temp; 

      if(hasdropped){ 
       return; 

      } 

     } 


    } 

    public void ButtonClick(){ 

     body.isKinematic = false; 

    } 


} 

Объект 2 сценария:

public class Object2 : MonoBehaviour { 

    [SerializeField] 
    private GameObject BallClone; 




    void OnCollisionEnter2D(Collision2D target){ 

     Destroy (target.gameObject); 

     Instantiate (BallClone,new Vector3(0f,2f,59f),Quaternion.identity); 


    } 

} 
+0

Хорошо, 2 вещи. Плз, посмотри, что это имеет смысл для тебя. 1- Вместо того, чтобы разрушать, сделайте это на пуле. Сбросьте его. 2- Попробуйте использовать тег для доступа к жесткому объекту вместо объекта public. –

+0

Вы используете ссылку на экземпляр где-то еще? – Everts

+0

@ ゴ ス エ ン ヘ ン リ ввод ввода нет новой строки, сообщения. На самом деле это раздражает. – Everts

ответ

0

Проблема заключается в том, что вы ссылаетесь на Object1Prefab (живой объект, а не сборный) на ClickButton On Click (). (Но ссылка на сборник не будет работать вообще)

Поскольку вы уничтожили его, вы пропустили ссылку. (Отметьте: выберите объект ClickButton в иерархии, есть ссылка на скрипт, прямо? Нажмите кнопку игры один раз. Теперь отмените выбор и выберите объект ClickButton в иерархии снова ... он исчез.)

Попробуйте сделать слушатель или поставить метод ButtonClick() внутри object2 (что вы не уничтожить):

using UnityEngine; 
using System.Collections; 

public class Object2 : MonoBehaviour { 

    [SerializeField] 
    private GameObject BallClone; 

    public GameObject mine; 


    void OnCollisionEnter2D(Collision2D target){ 

     Destroy (target.gameObject); 

     mine = Instantiate (BallClone,new Vector3(0f,2f,59f),Quaternion.identity) as GameObject; 


    } 




public void ButtonClick(){ 
//this is just an example. You might wanna to cache this info for better practice and not call GetComponent all the time 
      mine.GetComponent<Rigidbody2D>().isKinematic = false; 
     } 




} 

1- Drag GameObject1Prefab (живой объект) к сценарию Объект2 на поле «шахты». Ссылка на public GameObject mine.

Первый клика вы собираетесь уничтожить его и создать новую и программно ссылающийся на новую снова на линии:

mine = Instantiate (BallClone,new Vector3(0f,2f,59f),Quaternion.identity) as GameObject; 

На ClickButton объекта, вы перетаскивать GameObject2, а не 1, на On On().

Это ясно? Извините мой английский. : ~

+0

спасибо за ваш ответ, теперь я понимаю и последнее, что такое лучшая практика для решения такого вопроса –

+0

теперь сложно. Поскольку вы уничтожаете и создаете снова, вам нужно использовать GetComponent для повторного ссылки на Rigidbody. (Насколько я знаю). Но поскольку метод не является обновлением, вы можете использовать GetComponent без вины в виду. Это круто. –

Смежные вопросы