Удаление ранее добавленного компонента GameObject

У меня есть этот скрипт, в который он добавляет скрипт SelectMove во время выполнения, когда пользователь касается символа.

public GameObject target;

    void Start () {
    }

    // Update is called once per frame
    void Update () {
        if(Input.touchCount > 0 || Input.GetTouch(0).phase == TouchPhase.Began){
            ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);

            Debug.DrawRay(ray.origin,ray.direction * 20,Color.red);

            if(Physics.Raycast(ray, out hit,Mathf.Infinity)){
                Debug.Log(hit.transform.gameObject.name);


                target = hit.transform.gameObject; 
                //Destroy(hit.transform.gameObject);
                selectedPlayer();
            }
        }
    }

    void selectedPlayer(){

                target.AddComponent(Type.GetType("SelectMove"));

    }

В приведенном выше коде, если пользователь щелкнет Player A, игрок A будет двигаться с использованием акселерометра. Что мне нужно сделать, так это если я щелкну другого персонажа, скажем, игрока B, мне нужно, чтобы игрок A перестал двигаться, и теперь пришло время двигаться игроку B. Но мне казалось, что я не получаю того, что хочу. Я попытался уничтожить скрипт, используя Destroy(this) или этот код:

if (target != null)
                {
                    var sphereMesh = target.GetComponent<SelectMove>();
                    Destroy(sphereMesh);
                }

Но это все еще не работает.

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

Есть ли другой способ, которым я мог бы добиться того, что мне нужно было сделать?


person kmf    schedule 03.04.2016    source источник
comment
Лучше установить его в false, чем уничтожать sphereMesh.enabled = false   -  person Martin Dawson    schedule 04.04.2016
comment
Уничтожение должно работать нормально. (ONE) в вашем коде Destroy(sphereMesh); добавить Debug.Log(я здесь); Определите, действительно ли вызывается Destroy. Сообщите нам!   -  person Fattie    schedule 04.04.2016
comment
Это действительно работает сейчас. У меня такой же код, как указано выше, но теперь он работает нормально. Я не знаю, что я сделал, но все равно спасибо! :)   -  person kmf    schedule 04.04.2016


Ответы (2)


public GameObject target = null;

void Update () 
{
   if(Input.touchCount > 0 || Input.GetTouch(0).phase == TouchPhase.Began)
   {
       Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
       Debug.DrawRay(ray.origin,ray.direction * 20,Color.red);
       RaycastHit hit;
       if(Physics.Raycast(ray, out hit,Mathf.Infinity))
       {
            Debug.Log(hit.transform.gameObject.name);
            if(this.target != null){
                SelectMove sm = this.target.GetComponent<SelectMove>()
                if(sm != null){ sm.enabled = false; }
            }
            target = hit.transform.gameObject; 
            //Destroy(hit.transform.gameObject);
            selectedPlayer();
       }
    }
 }

 void selectedPlayer(){
    SelectMove sm = this.target.GetComponent<SelectMove>();
       if(sm == null){
           target.AddComponent<SelectMove>();
       }
       sm.enabled = true;  
 }

Код повторно использует вашу базу, новая часть заключается в том, что вы используете предыдущий выбранный объект для отключения сценария SelectMove (я предполагаю, что это тот, который перемещает вещи). Вместо того, чтобы уничтожить его, он включает/отключает, чтобы вы экономили потребление памяти.

person Everts    schedule 04.04.2016

Я не думаю, что добавление и удаление скриптов является здесь удобным методом.
Попробуйте следующее:
1. Добавьте скрипт SelectMove ко всем подвижным проигрывателям.
2. Добавьте общедоступное свойство bool IsMoving = false; в SelectMove. script и сделайте оператор if для перемещения, если IsMoving имеет значение true.
3. Измените метод selectedPlayer(), чтобы вместо этого изменить IsMoving целевого игрока на true, а предыдущий (или просто все остальные игроки) установить на false.

person Bassem Akl    schedule 03.04.2016
comment
Я запутался в том, как реализовать шаг 3. - person kmf; 04.04.2016
comment
Где вы уничтожаете скрипт, вы можете изменить это на target.IsMoving =false; - person Bassem Akl; 04.04.2016