Unity3D学习笔记(四) 脚本内访问其他对象,组件或脚本成员方法总结
(2012-07-08 13:40:50)
部分函数尽量不可在update使用,否则极其消耗资源
1.在一个脚本内访问其他对象:
想得到对象:可以用下述函数得到对象,或者直接定义一个变量让外部手动传入(可以的话尽量如此)。
①通过名字访问对象(消耗资源较多),注意对象名字分为带层次和不带层次。以A为例,"A"为可带父级,"/A"为不可含父级,"C/B/A"为C可带父级,"/C/B/A"为C不可带父级(未验证):GameObject.Find("对象名字");
②通过标签访问对象,在访问数量多个,却单一类别的对象时(如敌人)很有用,但注意事先给对象打上标签:
GameObject.FindWithTag ("标签名"); //通过标签访问单个对象,返回GameObject或null
③GameObject.FindGameObjectsWithTag("标签名"); //通过标签访问多个对象,返回GameObject[]或null
得到的对象一般新建GO类对象来接收。如果是对象组,则可以:
GameObject[] go = GameObject.FindGameObjectsWithTag("标签名");
2.在一个脚本内访问其他组件:
脚本等组件都是类,对应的实例一般是依托于游戏对象的。因此访问特定的组件实例必须先得到其依附的游戏对象,可以通过上述说的函数或者在脚本中定义外部变量两种方式得到某个游戏对象(外部变量传入对象方式时,传入类型设置为GameObject,才好找组件)。得到了对象后,很多组件就可以直接访问,比如Transform。
//在已经获取游戏对象BB实例情况下,A脚本访问BB对象上的脚本B的成员函数bb与变量bbb
B b=(B)BB.Getcomponent("B脚本的名字");
b.bb();或b.bbb;
注意!!!为了防错,所有找GO对象,传入G0对象的代码都要做防空报错处理。
3.在一个脚本内访问其所附加物体及其子物体上附加的所有MonoBehaviour子类脚本(包括自身在内)的同名函数:
使用消息广播函数:void BroadcastMessage (methodName : String, parameter : object = null,
options : SendMessageOptions = SendMessageOptions.RequireReceiver)
例如:BroadcastMessage("ApplyDamage", 5.0F);
//收到消息的0参数ApplyDamage函数会自动忽略参数5.0F
//SendMessageOptions.RequireReceiver方式会在没有任何组件接收消息时打印出错误
4.在一个脚本内访问其所附加物体的子物体信息:(层次关系控制)
GO的层次关系通过Transform组件的层次关系来体现,访问GO的子物体也常通过Transform组件来完成。
①this.transform.childCount //得到GO的Transform组件的子Transform的个数,也即子物体个数。
②transform.GetChild(从0开始的index); //得到该GO的第index+1个子物体的Transform组件。
③依据②中得到的子物体Transform组件可以进一步获取子物体游戏对象的信息:
transform.GetChild(index).gameObject; //得到子物体GameObject类
transform.GetChild(index).gameObject.name; //得到子物体名字
transform.GetChild(i).gameObject.SetActiveRecursively(true);//控制子物体是否显示达到切换武器等功能
碰撞后常要用Destroy(this.gameObject)消除火箭弹等,但这个函数会消除目标物体及其所有子物体,我们能需要保持烟尾等子物体效果不消除时,可以先用this.transform.DetachChildren();解除所有子物体与目标物体的父子关系(也是通过Transform组件控制父子关系)。
某些情况下需要解除特定子物体父子关系,可以通过访问子物体的this.transform.parent=null来实现(先用GetChild(i)遍历子物体,由名字得到目标子物体)。