Unity脚本篇 - 使用组件控制GameObject

在Unity编辑器中,可以使用Inspector更改GameObject的组件属性,还可以使用脚本修改组件属性b以操纵GameObjects。不过,不同之处在于脚本可以随着时间的推移组件改变属性的值,或者响应用户的输出。通过在适当的时间更改,创建和销毁对象,可以实现任何类型的游戏。

访问组件

说到访问组件,需要区分是访问连接到同一GameObject上的其他组件,还是访问其他GameObject上的组件。

访问同一GameObject的其他组件

获取刚体组件的基本脚本如下。

void Start () 
{
    // Get the object's Rigidbody.
    Rigidbody rb = GetComponent<Rigidbody>();
}

当拿到其他组件的对象引用之后,就可以像直接在Inspector中对组件设置属性值,或者调用一些在Inspector中未展示出来的功能函数。

void Start () 
{
    Rigidbody rb = GetComponent<Rigidbody>();

    // Change the mass of the object's Rigidbody.
    rb.mass = 10f;

    // Add a force to the Rigidbody.
    rb.AddForce(Vector3.up * 10f);
}

另请注意,没有理由不能将多个自定义脚本附加到同一对象。如果需要从另一个脚本访问一个脚本,可以像往常一样使用GetComponent,只需使用脚本类(或文件名)的名称来指定所需的Component类型。

如果尝试检索尚未实际添加到GameObject的Component,则GetComponent将返回null; 如果尝试更改空对象上的任何值,将在运行时获得空引用错误。

上面主要介绍了如何获取连接同一个GameObject的其他组件,而要想了解如何获取连接不同GameObject的其他组件,则需要先知道如何访问其他GameObject,下面会进行介绍。

访问其他GameObject

脚本很适合跟踪其他对象,例如,追捕敌人可能需要知道玩家的位置。Unity提供了许多不同的方法来检索其他对象,每种对象都适合某些情况。

将GameObjects与变量链接

查找相关GameObject的最直接方法是向脚本添加公共GameObject变量:

public class Enemy : MonoBehaviour
{
    public GameObject player;

    // Other variables and functions...
}

然后在场景中拖动对象,或者在Hierarchy面板中对此变量进行分配。这样,你就已经拿到了其他对象的引用,接着可以像其上一小节讲的一样,操作连接到改对象上的任意组件。

public class Enemy : MonoBehaviour {
    public GameObject player;

    void Start() {
    // Start the enemy ten units behind the player character.
    transform.position = player.transform.position - Vector3.forward * 10f;
    }
}

此外,如果在脚本中声明Component类型的公共变量,则可以拖动任何附加了该Component的GameObject。这将直接访问Component而不是GameObject本身。

public Transform[] childTransform;

在这里插入图片描述

在处理具有永久连接的单个对象时(即只包含一个GameObject中的子对象引用),将对象与变量链接在一起非常有用。你可以使用数组变量链接同一类型的多个对象,但仍必须在Unity编辑器中而不是在运行时进行连接。在运行时定位对象通常很方便,Unity提供了两种基本方法来完成此操作,如下所述。

检索子GameObjects

有时,游戏场景会使用许多相同类型的游戏对象,例如敌人,路径点和障碍物。这些可能需要由跟踪或响应它们的特定脚本跟踪(例如,路径查找脚本可能需要所有路径点)。使用变量链接这些GameObject是一种可能性,但如果必须将每个新的航点拖到脚本上的变量,它会使设计过程变得乏味。同样,如果删除了一个路径点,那么必须删除对丢失的GameObject的变量引用是一件麻烦事。在这种情况下,通常通过时它们成为一个父游戏对象的所有子对象来管理一组游戏对象通常会更好。可以使用父级的Transform组件检索子GameObjects(因为所有GameObjects都隐式地具有Transform),另外transform变量表示:The Transform attached to this GameObject. 包括连接该GameObject上的Transform组件,以及该游戏对象所包含的子对象的Transform组件。

public class MainPlayer : MonoBehaviour {

    public Transform[] childPoints;
    private void Start()
    {
        childPoints = new Transform[transform.childCount];
        int i = 0;
        foreach(Transform t in transform)
        {
            childPoints[i++] = t;
        }
    }
}

你还可以使用Transform.Find函数按名称查找特定的子对象:

transform.Find("Gun");

当对象具有可在游戏过程中添加和删除的子项时,这可能很有用。可以拾取和放下的武器就是一个很好的例子。

按名称或标记查找GameObjects

只要你有一些信息可以识别它们,就可以在场景层次结构中的任何位置定位GameObjects。可以使用GameObject.Find函数按名称检索单个对象:

GameObject player;

void Start() 
{
    player = GameObject.Find("MainHeroCharacter");
}

也可以使用GameObject.FindWithTagGameObject.FindGameObjectsWithTag函数通过标签定位对象或对象集合:

GameObject player;
GameObject[] enemies;

void Start() 
{
    player = GameObject.FindWithTag("Player");
    enemies = GameObject.FindGameObjectsWithTag("Enemy");
}

参考:https://docs.unity3d.com/Manual/ControllingGameObjectsComponents.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值