删除先前添加的游戏对象组件

Deleting previous added Component of a 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"));

    }

在上面的代码中,如果用户点击玩家 A,玩家 A 将使用加速度计移动。我需要做的是,如果我单击另一个角色,比如玩家 B,我需要玩家 A 停止移动,现在是玩家 B 移动的时间。但我似乎没有得到我想要的。我尝试使用 Destroy(this) 或以下代码破坏脚本:

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

但是还是不行。

如果我不破坏之前添加的脚本,如果用户点击另一个角色,之前选择的玩家仍然会随着新玩家移动。

还有其他方法可以实现我需要做的事情吗?

我认为添加和销毁脚本不是这里方便的方法。
试试这个:
1.所有可移动播放器添加SelectMove脚本
2.在SelectMove脚本中添加public属性bool IsMoving = false;,如果IsMoving为真,则进行if语句移动
3. 更改 selectedPlayer() 方法以将目标玩家 IsMoving 更改为 true,并将前一个(或只是所有其他玩家)设置为 false。

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 脚本(我假设它是一个移动的东西)。它没有销毁它,而是 enables/disables 所以你节省了内存消耗。