Unity获取物体、脚本、组件的引用

1.如果一个脚本要获取某个物体的引用,在脚本中定义Public GameObject go,在Hierarchy中将对应物体拖过去,这是最常用的方式,很简单

2.如果一个脚本要获取很多物体的引用,当然可以在脚本中定义很多个Public GameObject go变量,在Hierarchy中将对应物体一一拖过去,但是这样很麻烦。例如,万一某一更新脚本引用丢失,岂不是全部得重新拖。这时需要这样:

  • 将多个物体分类,同一类物体挂在一个新建的GameObject下,成为其子对象
  • 在脚本中定义一个变量Public GameObject carHolder,在Hierarchy中将GameObject拖过去
  • 在脚本中定义一个数组Public GameObject[] cars,在Start方法中初始化获取carHolder的子对象

3.随着逻辑复杂起来,有时一个物体的引用要被很多的脚本获得,这时可以这样:

  • 单独写一个ObjectRef脚本,脚本中有公开的成员变量,如Public GameObject  go,Public Button button等等,在Hierarchy中将对应的物体拖过去。
  • 新建一个GameObject,改名字为RefHolder,将ObjectRef挂载在下面
  • 在某个脚本中获取某个物体的引用时 :Button button= GameObject.Find("RefHolder").GetComponent().button;

4.有时在游戏运行时才需要获取某个对象的引用,这时可以这样:

public GameObject go;

go=GameObject.Find(''GameObjectName'');//使用名字

go=GameObject.FindWithTag("car");//通过标签

public GameObject[] enemies;

enemies = GameObject.FindGameObjectsWithTag("Enemy");//获取具有同样标签的一系列物体

5.获取脚本的引用实际上我们是想调用脚本中的某个方法,如果当前类所在的脚本的所在的物体和这个方法所在的脚本的所在的物体有父子关系,可以通过广播的方法直接调用:

BroadcastMessage("methodName")   如果这个脚本所在的物体上的其他脚本以及这个物体的所有子物体的所有脚本中有这个方法名的方法,那么这个方法会被调用

SendMessage("methodName")  只对当前脚本所在的物体上的其他脚本内查找有没有这个方法名,有的话就调用

SendMessageUpwards("methodName")   在当前物体及其所有父物体上发送

6.如果在某一个类中需要调用很多其他类中的引用,这些其他类可能在不同的物体上面,这些物体没有父子关系,如果依次引用这些物体,获取脚本,再调用方法,那么这样做就使得在当前类中引用过多的其他类,耦合度增大,使得后期其他类改动一点,当前类就得改很多。更好的方式是使用委托:

首先,新建一个脚本,命名为EventUtil。在类的外面(不能在类里面)定义委托,例如 public delegate void  Create(int value);

其次,在类里面定义静态委托实例,例如public static Create  createGo;

最后,开始调用,假设在Fight类中要调用另一个中的Model类中的CreateCar方法:需要先在Model类中初始化,例如EventUtil.createGo = CreateCar, CreateCar是Model类中的一个方法;在Fight类中可以这样调用EventUtil.createGo(value);

你可以将所有需要调用的方法都写个委托,并且可以将这些委托都写在EventUtil脚本中

7.我们通常会用Manager管理很多个相同的子物体,例如RoleManager管理很多个带有Role脚本的物体,我们通常会在RoleManager中写有List roles,这样很容易获取role的引用。如果Role想获取RoleManager的引用调用其中的方法,该怎么办呢?

第一种方式是在RoleManager中定义静态字段或静态方法,在Role脚本中就可以直接调用

第二种方式是将RoleManager写成单例

第三种方式是通过其他类获取RoleManager的引用,例如GameController脚本

第四种是用委托,在Role里定义一个委托,例如private Action action,在Role初始化的时候传递委托参数 Init(Action action){this.aciton = action},在RoleManager中调用Role的初始化方法时传递参数role.Init(DoAction) ,DoAction()时RoleManager中的方法。

推荐第四种方法

你可能感兴趣的:(Unity,获取物体引用,调用方法)