文档章节

使用组件控制物体

LIndieGS
 LIndieGS
发布于 2017/05/18 23:24
字数 1414
阅读 3
收藏 0
点赞 0
评论 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 TimeLine丨A1.创建TimeLine、Animation Track,Extrapolation属性讲解

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

weixin_38239050
04/11
0
0
Unity动画丨9.木头自转、扛起木头、OnTriggerEnter

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

weixin_38239050
04/08
0
0
EasyTouch的使用(一)

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

月夜中徘徊
05/15
0
0
工具-unity基础学习总结2

呈上一篇:工具-unity基础学习总结1 30. 角色场景控制及制作 1. 鼠标指定对应的方向; 2. 形成光圈的效果; 3. 对应的角色面朝向对应的方向,并往鼠标指定的方向移动; 4. 移动的过程中有动画...

lhm1019
04/13
0
0
unity 实现物体破碎效果的一些方法 - 细雨淅淅

游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界。场景的逼真是在渲染效果、角色AI、游戏逻辑、物理效果等等一起导致的结果。现在游戏越来越大,...

付翔
2016/12/01
0
0
【Unity3D入门教程】Unity3D界面介绍及游戏对象基本操作

1 界面介绍 在Windows等图形化操作系统上,熟练地使用菜单、图标、快捷键等,将会极大提升工作效率。因此,要认识一个软件,学会熟练使用他们,就必须先认识软件的界面。 先点击菜单栏的Win...

zzlyw
2017/01/06
0
0
Unity 多物体联动动画

分享一个前几天写的插件,当时为了做多个物体的简单动画(只有移动、旋转、缩放之类的)同时运动效果而写的,说白了算不上什么高级的联动动画,就只是同时控制多个物体协调运动而已,像什么机...

qq992817263
2017/06/12
0
0
一个前线开发者的VRTK笔记(一)

Paste_Image.png 前言:VRTK官方插件的DOCUMENT.MD文档是英文,看起来略吃力。其教程是油管视频需要翻墙且全英文。网上的教程基本都是只覆盖到场景搭建和简单交互。远远不够实际开发需要。本...

Angeladaddy
2017/06/02
0
0
Unity 各个方面的性能优化

转自:http://www.ceeger.com/forum/read.php?tid=16333 官方优化文档--优化图像性能 http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html Unity3D性能优化专......

qq_24378389
2017/10/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
28分钟前
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
0
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
6
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部