Unity 访问其他游戏物体的几种方法

 

 

 

很多高级游戏代码不仅仅控制单一物体。Unity脚本接口有很多方法获得和访问其他游戏物体和组件。下面我们假设有一个名为OtherScript.js的脚本附属于场景中的游戏物体。

var foo = 5;
function DoSomething ( param : String) {
print(param + " with foo: " + foo);
}

1.使用检视视图指定参数。

你能通过检视视图为一些游戏类型指定变量:

// Translate the object dragged on the target slot
var target : Transform;
function Update () {
target.Translate(0, 1, 0);
}

也能显示参数在其他物体检视视图。下面你能在Inspector面板中拖拽包含OtherScript的游戏物体到target上。

// Set foo DoSomething on the target variable assigned in the inspector.
var target : OtherScript;
function Update () {
// Set foo variable of the target object
target.foo = 2;
// Call do something on the target
target.DoSomething("Hello");
}

2.通过继承结构

你能通过Transform组件获得一个子和父物体到现在的物体。

// Find the child "Hand" of the game object
// we attached the script to
transform.Find("Hand").Translate(0, 1, 0);

你只要在hierarchy面板建立了transform,你就能用GetComponent去获取other scripts。

// Find the child named "Hand".
// On the OtherScript attached to it, set foo to 2.
transform.Find("Hand").GetComponent(OtherScript).foo = 2;

// Find the child named "Hand".
// Call DoSomething on the OtherScript attached to it.
transform.Find("Hand").GetComponent(OtherScript).DoSomething("Hello");

// Find the child named "Hand".
// Then apply a force to the rigidbody attached to the hand.
transform.Find("Hand").rigidbody.AddForce(0, 10, 0);

你可以循环到它所有的子物体。

// Moves all transform children 10 units upwards!
for (var child : Transform in transform) {
child.Translate(0, 1, 0);
}

查看文档Transform类 可以获得更多信息。

3.通过名字或标签

你能用确定的标签搜索物体,使用GameObject.FindWithTag 和GameObject.FindGameObjectsWithTag。使用GameObject.Find通过名字获得游戏物体。

function Start ()
{
// By name
var go = GameObject.Find("SomeGuy");
go.transform.Translate(0, 1, 0);

// By tag
var player = GameObject.FindWithTag("Player");
player.transform.Translate(0, 1, 0);
}

你能使用GetComponent获得脚本或组件在找到的游戏物体上。

function Start ()
{
// By name
var go = GameObject.Find("SomeGuy");
go.GetComponent(OtherScript).DoSomething();

// By tag
var player = GameObject.FindWithTag("Player");
player.GetComponent(OtherScript).DoSomething();
}

一些特殊对象如主摄像机有快捷方式,可以使用Camera.main。

4.传递参数

一些事件中包含详细的事件。例如:扳机事件传递(碰撞)Collider组件到碰撞物体的handler函数。

OnTriggerStay给我们一个碰撞参数.从碰撞体我们能给他赋一个刚体。

function OnTriggerStay( other : Collider ) {
// If the other collider also has a rigidbody
// apply a force to it!
if (other.rigidbody) {
other.rigidbody.AddForce(0, 2, 0);
}
}

或者我们可以获取游戏中碰撞者包含的任意组件。

function OnTriggerStay( other : Collider ) {
// If the other collider has a OtherScript attached
// call DoSomething on it.
// Most of the time colliders won't have this script attached,
// so we need to check first to avoid null reference exceptions.
if (other.GetComponent(OtherScript)) {
other.GetComponent(OtherScript).DoSomething();
}
}

注意上面的例子,使用其他变量上的后缀,你能获取一些碰撞物体里的组件。

5.某个类型的所有脚本

从一个类找到任意对象或脚本,用Object.FindObjectsOfType或获得某个类型的第一个物体使用Object.FindObjectOfType.

function Start ()
{
// Find the OtherScript which is attached to any game object in the scene.
var other : OtherScript = FindObjectOfType(OtherScript);
other.DoSomething();
}

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值