删除先前添加的游戏对象组件
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 所以你节省了内存消耗。
我有这个脚本,当用户触摸一个角色时,它会在运行时添加 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 所以你节省了内存消耗。