删除以前添加的GameObject组件

时间:2016-04-03 21:02:22

标签: c# unity3d multiplayer 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);
                }

但它仍无效。

如果我没有销毁之前添加的脚本,如果用户点击了另一个字符,则之前选择的播放器仍会与新脚本一起移动。

还有另一种方法可以实现我需要做的事情吗?

2 个答案:

答案 0 :(得分:0)

我不认为添加和销毁脚本是方便的方法 试试这个:
1.将SelectMove脚本添加到所有可移动的播放器 2.将一个公共属性private void tabs_Menu_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedTab = (sender as TabControl).SelectedItem as TabItem; if (selectedTab.Header.ToString() == "Plugins") { RefreshPluginList(); } } string PluginDirectory; private void RefreshPluginList() { list_Plugins.Items.Clear(); PluginDirectory = Path.Combine(new string[] { Path.GetDirectoryName(Properties.Settings.Default.Rustserverexecutable), "server", Properties.Settings.Default.Identity, "oxide", "plugins" }); foreach (var file in Directory.GetFiles(PluginDirectory)) { list_Plugins.Items.Add(Path.GetFileName(file)); } } 添加到SelectMove脚本中,并在IsMoving为真时使if语句移动。
3.将selectedPlayer()方法更改为将目标玩家IsMoving更改为true,并将前一个(或简称所有其他玩家)设置为false。

答案 1 :(得分:0)

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脚本(我假设它是一个移动的东西)。它不会破坏它,而是启用/禁用,以便节省内存消耗。