文档章节

使用组件控制物体

LIndieGS
 LIndieGS
发布于 2017/05/18 23:24
字数 1414
阅读 3
收藏 0

原文链接:https://docs.unity3d.com/Manual/ControllingGameObjectsComponents.html

     在Unity中,你能使用监视器(Inspector)来改变组件的属性。所以,例如,改变Transform(变化) 组件的position(位置)的值就会引起组件位置的改变。类似的,你可以改变着色器(Render)材质(Material)的颜色或刚体(Rigidbody)的质量,使物体的外观和行为有一个合适的效果。在多数情况下,脚本也是通过改变物体的属性来操控物体的。不同的是,脚本能改变随着时间的推进逐步改变属性值,或响应一个来自玩家的输入。通过在正确的时间改变,创建和销毁物体,任何种类的玩法(gameplay)都能被实现。

访问组件

      最简单、最常见的情况是一个脚本需要访问挂在同一物体上的其他组件。一个组件实际上是一个类的实例(instance)。因此第一步就是获取一个你想要执行的组件实例的引用。GetComponent()函数可以实现这个功能。典型地,你想指定这个组件对象给一个变量,在C#中,可以通过下面的语句实现这件事情。

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

     一旦你建立了一个组件实例的引用,你就能设置它的属性值。甚至你可以在Inspector中改变它。

void Start () {
    Rigidbody rb = GetComponent<Rigidbody>();
    
    // Change the mass of the object's Rigidbody.
    rb.mass = 10f;
}

     一个额外的特性是可以调用组件实例中的函数。(这个特性不能在Inspector中实现)

void Start () {
    Rigidbody rb = GetComponent<Rigidbody>();
    
    // Add a force to the Rigidbody.
    rb.AddForce(Vector3.up * 10f);
}

 

    值得注意的是:你不能有超过一个自定义脚本挂在同一个对象上。如果你需要访问来自另一个对象上脚本,你通常可以使用GetComponent()函数,只需要在尖括号里包括脚本类的类名(或文件名),去指定你想要的组件的类型。

    如果你企图去获取这个物体上并不存在的组件,那么GetComponent()函数会返回一个null(空);如果你尝试改变任何在空对象中的值,你将会在运行时得到一个空引用错误。

访问其他对象

    尽管它们有时能独立执行,但对于脚本来说,访问其他对象是很普通的。比如,创建一个跟踪玩家的敌人可能需要知道玩家的位置。Unity提供了许多的不同的方法检索其他对象,每一个都适用于特定的情况。

用变量链接对象

    找到相关物体最直接的方法是在脚本中添加一个GameObject的变量(声明为public):

public class Enemy : MonoBehaviour {
    public GameObject player;
    
    // Other variables and functions...
}

    和其他变量一样,这个GameObject的变量也能在监视器里看到。

    你可以从场景(Scene)或层级(Hierarchy)中拖进一个物体。GetComponent()函数和组件访问变量就能在这个物体上使用,所以你可以使用如下代码:

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;
    }
}

    另外,如果在你的脚本中声明一个公有的组件型变量,你能拖进任何一个挂有你想访问组件的物体。它会直接访问物体的这个组件,而不是访问这个物体本身。

public Transform playerTransform;

    当你在处理某些对象会一直和其他对象有联系时,通过变量链接对象是最有效的手段。你可以使用数组变量来链接多个同类型的物体,但是这种链接必须在编辑游戏是就设定好,而不能在游戏运行时去设定。在游戏运行时,用这种方法来定位一个对象是很方便的。Unity提供了两种基础的方法来实现这件事情,如下所述。

寻找子物体

    有时,在一个游戏场景中会使用许多同类型的物体。比如敌人,路标和障碍。这可能需要被一个特殊的脚本追踪,这个脚本能指导这些物体,或对它们有一些反应。(比如:所有的路标都需要被一个寻路脚本访问)。使用变量去连接这些脚本是可行的,但是它会使设计过程非常繁琐,如果每一个新路标都被拖进一个变量。同样地,如果一个路标被删除,就不得不为这个路标移除所有变量的引用。为了避免这件事情,通常安排这一组对象为同一个父级的子级。这些子对象就可以使用父级的Transform组件去访问。(因为所有的GameObject都隐含一个Transform组件)。

using UnityEngine;

public class WaypointManager : MonoBehaviour {
    public Transform[] waypoints;
    
    void Start() {
        waypoints = new Transform[transform.childCount];
        int i = 0;
        
        foreach (Transform t in transform) {
            waypoints[i++] = t;
        }
    }
}

   这非常有用,当一个对象有一个子对象,这个子对象在游玩过程中能被随时添加和移除。游戏中,捡起或丢弃武器就是一很好的例子。

通过名字或标签来寻找物体

    你能在场景层级的任何地方定位一个物体,只要你有一些识别它们的信息。单个物体能通过名字去访问,这就要用到GameObject.Find()函数:

GameObject player;

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

    一个物体或是物体的集合也可以被它们的标签(tag)定位,可以使用GameObject.FindWithTag()和GameObject.FindGameObjectsWithTag()函数:

GameObject player;
GameObject[] enemies;

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

 

© 著作权归作者所有

共有 人打赏支持
LIndieGS
粉丝 0
博文 9
码字总数 6421
作品 0
程序员
Unity 多物体混合动画、值变动画控制器

前言 因为工作中有用到,所以我抽出空闲把之前的LinkageAnimation优化了一下,如果有类似的需求(比如场景中有大量的物体,都按照同一频率在运动),那么这个工具可能适合你,当然如果你的环...

qq992817263
2017/11/09
0
0
Unity动画丨9.木头自转、扛起木头、OnTriggerEnter

一、给场景添加木头 1、导入木头Log,找回丢失的贴图,通过Perfab的Model—Scale Factor调节导入比例—0.3 2、控制策略:通过检测木头与人物的碰撞,控制人物捡起木头 3、给木头添加Sphere ...

weixin_38239050
04/08
0
0
Unity TimeLine丨A1.创建TimeLine、Animation Track,Extrapolation属性讲解

TimeLine与Animator区别: Animator动画应用于人形、非人形模型,对单个物体进行动画控制 TimeLine可结合多个游戏物体做过场动画,呈现出电影效果 一、创建TimeLine TimeLine跟Animation一样...

weixin_38239050
04/11
0
0
[专栏精选]Unity中动态构建NavMesh

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/83039998 本文节选自洪流学堂公众号专栏《郑洪智的Unity2018课》,未经允许不...

关尔Manic
10/13
0
0
EasyTouch的使用(一)

情景: 用unity开发游戏的时候,有时候想控制物体移动,但是发现做按钮太麻烦了,就想着又没有插件可以用,后来发现了easytouch,发现挺不错的,就拿过来用了,这里分享一下easytouch的使用吧...

月夜中徘徊
05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

创建第一个react项目

sudo npm i -g create-react-app@1.5.2 create-react-app react-app cd react-appnpm start

lilugirl
10分钟前
0
0
在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

Generative Adversarial Network 是深度学习中非常有趣的一种方法。GAN最早源自Ian Goodfellow的这篇论文。LeCun对GAN给出了极高的评价: “There are many interesting recent development...

naughty
21分钟前
0
0
搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
今天
2
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
3
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部