多数高级的游戏代码并不仅仅控制单独的游戏对象. Unity脚本有很多方法去查找和访问他们的游戏对象和组件.下面我们假设一个脚本OtherScript.js附于场景中的一个游戏对象上. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- void Update() {
- otherScript = GetComponent<OtherScript>();
- otherScript.DoSomething();
- }
- }
复制代码1. 通过检视面板指定参数. 你能通过检视面板为一些对象类型设置变量值: - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- public Transform target;
- void Update() {
- target.Translate(0, 1, 0);
- }
- }
复制代码你也可以把参数显示在检视面板.随后你可以拖拽游戏对象OtherScript到检视面板中的target位置. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- public OtherScript target;
- void Update() {
- target.foo = 2;
- target.DoSomething("Hello");
- }
- }
复制代码2. 确定对象的层次关系 你能通过游戏对象的 Transform组件去找到它的子对象或父对象: - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- public void Awake() {
- transform.Find("Hand").Translate(0, 1, 0);
- }
- }
复制代码
一旦你在层次视图找到transform,你便能用 GetComponent获取其他脚本. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- public void Awake() {
- transform.Find("Hand").GetComponent<OtherScript>().foo = 2;
- transform.Find("Hand").GetComponent<OtherScript>().DoSomething("Hello");
- transform.Find("Hand").rigidbody.AddForce(0, 10, 0);
- }
- }
复制代码
你能循环到所有的子对象: - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- public void Awake() {
- foreach (Transform child in transform) {
- child.Translate(0, 10, 0);
- }
- }
- }
复制代码3.指定名字或标签. 你能用确定的标签搜索对象,使用 GameObject.FindWithTag和 GameObject.FindGameObjectsWithTag.使用 GameObject.Find通过名字获得游戏对象. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- void Start() {
- GameObject go = GameObject.Find("SomeGuy");
- go.transform.Translate(0, 1, 0);
- GameObject player = GameObject.FindWithTag("Player");
- player.transform.Translate(0, 1, 0);
- }
- }
复制代码
你可以用GetComponent获得指定游戏对象上的任意脚本或组件. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- void Start() {
- GameObject go = GameObject.Find("SomeGuy");
- go.GetComponent<OtherScript>().DoSomething();
- GameObject player = GameObject.FindWithTag("Player");
- player.GetComponent<OtherScript>().DoSomething();
- }
- }
复制代码
一些特殊对象,比如主摄像机,用快捷方式 Camera.main.
4. 传递参数 一些事件包含详细的消息信息.例如,触发事件传递碰撞对象的 Collider组件到处理函数. OnTriggerStay给我们一个碰撞体参数.通过这个碰撞体我们能得到它的刚体. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- void OnTriggerStay(Collider other) {
- if (other.rigidbody)
- other.rigidbody.AddForce(0, 2, 0);
- }
- }
复制代码
或者我们可以通过collider得到这个物体的任何组件. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- void OnTriggerStay(Collider other) {
- if (other.GetComponent<OtherScript>())
- other.GetComponent<OtherScript>().DoSomething();
- }
- }
复制代码
注意, 在上面的例子中使用后缀的方式访问其他变量.同样,你能访问到碰撞对象包含的任意组件。
5. 某个类型的脚本 找到某个类型的对象或脚本可以用 Object.FindObjectsOfType或获得某个类型的第一个对象使用 Object.FindObjectOfType. - using UnityEngine;
- using System.Collections;
- public class example : MonoBehaviour {
- void Start() {
- OtherScript other = FindObjectOfType(typeof(OtherScript));
- other.DoSomething();
- }
- }
复制代码
|