前段日子学了Unity官网的拾荒者Scanverges,之后突发奇想想做一个重新开始的按钮,但是由于是代码实例化对象,而且要删除子父物体,且要通过代码给新实例化的物体添加脚本,所以网上查了一些资料,自己在此进行总结希望能够获得更多的进步。
删除子父物体的代码有两种:
① 第一种是在一个不会被销毁与隐藏渲染的物体上添加代码进行查找与删除:
/// 脚本位置:将此脚本挂载到不会被销毁与不会被隐藏的物体身上
/// 脚本功能:删除需要删除的物体与其子物体
public void DestroyPrtAndSon()
{
if (parentObject == null)
parentObject = GameObject.Find("Board").gameObject;
for (int i = 0; i < parentObject.gameObject.transform.childCount; i++)
Destroy(parentObject.gameObject.transform.GetChild(i).gameObject);
Destroy(parentObject.gameObject);
}
② 第二种是建立两个脚本,把子父物体的代码添加到各自的物体上,然后进行删除,这种也是要通过GameObject.Find的查询语句找到相应的物体添加代码才能够实现,代码如下:
/// 脚本位置:将此脚本挂载到父物体A身上
/// 脚本功能:发送广播给自己和自己的所有子物体
public class DestoryParent : MonoBehaviour {
void Start()
{
// 执行Start方法后会发送一个广播
// 广播会从自身开始查找这个DestoryMe方法,查找完自身后会查找所有子物体
BroadcastMessage("DestoryMe");
}
}
/// 脚本位置:每个需要被销毁的子物体身上
/// 脚本功能:销毁自身
public class DestorySon : MonoBehaviour {
// 作为被广播通知的方法,由父物体通知执行
public void DestoryMe()
{
Destroy(gameObject);
}
}
关于代码添加脚本的代码如下:
//如果要添加其他的属性,也能通过AddConponent<属性名>()去实现
public void AddScripts()
{
GameObject gameObject = new GameObject();
gameObject.AddComponent<DestoryParent>(); //添加绑定脚本
Destroy(gameObject.GetComponent("DestoryParent")); //删除脚本
}
同时,我通过代码更改物体的Layer和Tag,可以更快捷的找到与处理相关的物体,下面是通过代码更改物体Layer与Tag的相关代码:
public void ChangeTagOrLayer()
{
parentObject.layer = LayerMask.NameToLayer("CouldDestory"); //改变Layer的值
parentObject.tag = "Board"; //改变Tag的值
}
/*需要注意的是,在更改Layer与Tag 的时候,更改的值必须是添加已经存在的Layer与Tag,不然就会报错,如果需要根据更改的Layer与Tag而在Unity中动态添加相应的属性,那么就必须使用代码进行相应的创建,目前尚无涉及,在接下来的一星期,准备进行动态Tag与Layer的学习,到时学习心得一并上传*/