unity3d培训吧 关注:82贴子:522
  • 0回复贴,共1

unity3d学习教程之控制游戏对象

只看楼主收藏回复

在unity中,可以在监视器面板中修改物体的组件属性,但是更多的时候,需要使用脚本来进行这些操作。
  1 访问组件
  最常见的一个情形是需要使用脚本访问附加到相同游戏对象上的另一个组件(当前脚本就是一个组件,其他的组件也就是另一个组件了)。在引言中提到过,一个组件实质上是一个类的实例,因而首先需要做的是获取想要操作的组件实例的引用。这个通过GetComponent函数来实现。典型的,可能会想要将一个组件赋值给一个变量,如下代码所示(蓝鸥unity官方授权培训中心)
  void Start () {
  Rigidbody rb = GetComponent<Rigidbody>();
  }
  一旦获取了组件实例的引用,就可以对它的属性进行想要的操作,同时也可以调用它之上的一些功能函数。
  如果想要访问另一个的脚本文件,也可以使用GetComponent,只需使用脚本的类名作为该函数的组件类型参数(因为脚本本来就也是一个组件)。(蓝鸥unity官方授权培训中心)
  如果想要去获取一个并没有添加到当前游戏对象的组件,GetComponent函数会返回null,如果试图去改变一个null对象上的任何值,将会发生null引用错误。
  由于一些组件类型经常使用,unity提供了一些内置的变量来访问它们,例如可以使用下面的代码(蓝鸥unity官方授权培训中心)
  void Start () {
  transform.position = Vector3.zero;
  }
  而不用使用GetComponent去获得Transform组件,所有的内置组件变量列表在MonoBehaviour类的参考手册里面有。
  2 访问其他对象(蓝鸥unity官方授权培训中心)
  虽然游戏对象有的时候都是各自处理,使用代码进行跟踪其他物体是常有的事。例如,一个追赶的敌人可能需要知道玩家的位置,unity提供了一系列不同的方法来获取其他对象,各适合不同的场合。
  <1> 将对象链接到变量
  最直接的办法是将一个游戏对象添加到脚本的公有成员变量上,直接在编辑器中将需要访问的游戏对象拖到对应脚本组件的那个公有成员变量上,unity会自动根据变量的类型将添加的游戏对象中相同的组件类型映射到该变量。
  例如将一个游戏对象拖给一个Transform的成员变量,就会自动的将游戏对象的Transform组件和该变量映射起来。
  直接将对象和变量链接起来在处理需要有永久链接的对象的时候是最有用的方法。同时也可以使用一个数组变量和几个相同类型的对象链接起来,但是这种链接必须在unity编辑器中完成,而不能在运行时进行。通常使用下面的两种方法来在运行时定位对象。(蓝鸥unity官方授权培训中心)
  <2> 查找子物体
  有的时候,一个游戏场景中可能会用到很多同一类型的对象,例如敌人、路点(waypoints)和障碍物。这些对象在游戏中需要由一个特定的脚本来监视和响应。这个时候使用变量来链接这些对象太过麻烦不好操作。对于这种情况,通常更好的方法是将一系列的对象添加到一个父对象下面,这些子对象可以通过使用父对象的Transfrom组件来获得。
  [csharp] view plaincopy
  public class WaypointManager : MonoBehaviour {
  public Transform waypoints;
  void Start() {
  waypoints = new Transform[transform.childCount];
  int i = 0;
  for (Transform t in transform) {
  waypoints[i++] = t;
  }
  }
  }
  同时也可以使用Tranfrom.Find来查找某个具体的子对象。使用Transform来进行对象查找操作是因为每一个游戏对象都有Transfrom组件。
  <3> 通过名称或标签访问对象(蓝鸥unity官方授权培训中心)
  只要有一些信息,在层级场景中的任何位置定位到该游戏对象是可能的。单个对象可以通过GameObject.Find函数进行查找。如下:
  GameObject player;
  void Start() {
  player = GameObject.Find("MainHeroCharacter");
  }
  某个对象或者一系列的对象也可以分别通过GameObject.FindWithTag和GameObject.FindObjectsWidthTag函数进行定位。
  <4>查找特定类型的对象
  staticObjectFindObjectOfType(Type
  type)
  返回指定类型对象中的第一个活动的加载对象(蓝鸥unity官方授权培训中心)
  需要注意的是这个函数很慢(可能是由于要在整个场景中进行遍历),不推荐每一帧都使用这个函数,在大多数情况下可以使用单件模式
  例如
  Camera cam = FindObjectOfType(typeof(Camera)) as Camera;
  由于该函数返回的类型是Object,所以需要使用as进行一下强制转换。
  static Object[] FindObjectsOfType(Type type);
  返回指定类型的加载活动对象的列表,速度也慢(蓝鸥unity官方授权培训中心)
  HingeJoint[]
  hinges = FindObjectsOfType(typeof(HingeJoint))
  as
  HingeJoint[];(蓝鸥unity官方授权培训中心)


1楼2014-12-12 16:16回复