【Unity3D基础教程】给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics..._weixin_34163741的博客-程序员信息网

技术标签: 测试  游戏  

作者:王选易,出处:http://www.cnblogs.com/neverdie/  欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点推荐。谢谢!

QQ图片20140529123319

 

Unity3D重要模块的类图

最近刚刚完成了一个我个人比较满意的小项目:【深入Cocos2d-x】使用MVC架构搭建游戏Four,在这个游戏中,我使用了自己搭建的MVC架构来制作一个游戏,做到了比较好的SoC(关注点分离)。但是苦于Cocos2d-x没有一个比较完善的编辑器,所以我开始学习另一个非常流行的游戏引擎-Unity3D。

Unity3D是一个Component-Based的游戏引擎,并且为GamePlay Progrmmer提供了很多游戏性层上的支持。比如可以在图形界面上设计动画状态转换的Animator。比如可以直接在场景编辑器中方便进行调整的Collider。比如可以动态调整动画曲线的Animation。总的来说,Unity是一个架构比Cocos2d-x精巧许多的游戏引擎。

但是很遗憾的是,Unity本身并不开源,还好,Unity在不开源的情况下却做了比较详尽的文档支持。同时,Unity的社区也是很友好的,stackoverflow也有许多值得一看的问题。

顺便推荐几个学习Unity的网站:

Unity圣典

Unity的官方文档

Unity的知乎话题

 

我在学Unity3D的知识的时候,发现Unity内部涉及的重要类比Cocos2d-x要多,有点理不清的感觉,所以制作了下面的设计类图来为像我一样的初学者提供一个Unity的初步印象。

 

 

Components

 

GameObject和Component

由于Unity是一个Component-Based的游戏引擎,所以游戏中所有的物体都是一个GameObject,为了给这个GameObject附加上各种各样的属性,所以我们引入了Component这个概念。

GameObject是由Component组合成的,Component的生命周期和GameObject息息相关。一旦GameObject的Destroy方法,它的子对象和对应的所有Component都会被销毁,同时,我们也可以一次只销毁一个单独的Component。

Component有如下这些种类,我制作了一张表格来记录它们的用途:

 

QQ截图20140528004158

 

组件附属于游戏物体.把一个 Renderer (渲染器)组件附到游戏对象,可以使游戏对象显示到场景,附一个 Camera (摄像机)可以把物体变成一个摄像机物体.所有脚本都是组件,因此都能附到游戏对象上.

常用的组件可以通过简单的成员变量取得:

附在游戏对象上的组件或脚本可以通过GetComponent获取.如下代码示例:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Awake() {
        transform.Translate(0, 1, 0);
        GetComponent<Transform>().Translate(0, 1, 0);
    }
}
1
  

Input和InputManager

关于Input的深入解读请参考这篇文章:Input 输入

Unity支持,键盘,操纵杆和游戏手柄输入。

输入管理器(Input Manager)可以创建虚拟轴和按钮,并终端用户可以在屏幕配置对话框配置键盘输入。

如果想添加新的虚拟轴,选择菜单Edit->Project Settings->Input menu。这里可以改变每个轴的设置。即可进入Input Manager的配置界面。

 

Android-Input-2

 

从脚本,所有虚拟轴通过它们的名字(name)来访问。

当创建时,每个项目都具有下面的默认输入轴

  • Horizontal and Vertical are mapped to w, a, s, d and the arrow keys.
    水平和垂直被映射到w, a, s, d键和方向键
  • Fire1, Fire2, Fire3 are mapped to Control, Option (Alt), and Command, respectively.
    Fire1, Fire2, Fire3被分别映射到Ctrl,Option(Alt)和Command键
  • Mouse X and Mouse Y are mapped to the delta of mouse movement.
    Mouse X 和 Mouse Y被映射到鼠标移动增量
  • Window Shake X and Window Shake Y is mapped to the movement of the window.
    Window Shake X 和 Window Shake Y 被映射到窗口的移动

 

Time

Time类是Unity中的一个全局变量,它记载了和游戏相关的时间,帧数等数据。

Time 类包含一个非常重要的变量叫deltaTime.这个变量包含从上次调用Update 或FixedUpdate到现在的时间(根据你是放在Update函数还是FixedUpdate函数中).(另注: Update每帧调用一次)

依照上面的例子,使得物体在一个匀速的速度下旋转,不依赖帧的速率,如下:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Update() {
        transform.Rotate(0, 5 * Time.deltaTime, 0);
    }
}
1
当然了,在使用Time这个类的时候,我们也要记住使用各种各样的Lerp函数来减少自己的工作量,在Unity3D中,Vector3,Vector2,Color等类都提供了相应的Lerp函数给我们调用。
1
  

Physics和Transform

Physics类是Unity重的一个工具函数类,它主要提供了Linecast和Raycast两种射线投射方式。

其中Linecast是以投射的起始位置和终止位置为参数,来判断这个投射有没有和某个Collider发生了碰撞。

而Raycast则是以投射的起始位置和投射方向为参数,来判断这个投射有没有和某个Collider发生了碰撞。

相应的实例可以看下面的这一段程序:

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    void Update() {
    // 使用Raycast
        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        if (Physics.Raycast(transform.position, fwd, 10))
            print("There is something in front of the object!");
        // 使用Linecast
    Transform target;
    if (!Physics.Linecast(transform.position, target.position))
        ProcessData.AndDoSomeCalculations();
    }
}

在Physics这个模块中,有三个Component是至关重要的,分别是RigidBody,Collision,Joint。在新的版本中,又引入了RigidBody2D,Collision2D,Joint2D这些Component来处理2D中的Physics事件。

这三个类都是处理物理相关的事件的,那么它们有什么区别呢?

RgidBody是作为一个受力物体而存在的,所以可以向一个RigidBody施加Force(力),Drag(阻力)。同时RigidBody还有 velocity (速度),mass(质量),position(位置),旋转(rotation)等等。

Collider是为了处理物理中的碰撞事件而出现的类,就像上面表格中所说的,如果没有Collider,两个RigidBody之间是无法发生碰撞的。对同一个GameObject可以绑定多个Collider构建更加复杂的碰撞体结构。Collider另外一个很值得注意的就是我们可以为Collider设置material,即Collider的物理材质。 物理材质用于调整摩擦力和碰撞单位之间的反弹效果。

当发生碰撞时,会触发毁掉函数OnCollisionEnter,OnCollisionStay,OnCollisionExit等等。这几个函数与OnTriggerXXX的区别会在接下来的博客中提到。

Joint用于连接两个RigidBody,当Joint断掉的时候会触发OnJointBreak的回调函数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34163741/article/details/85837282

智能推荐

关于DDR3时钟和时钟与数据格式的经典分析_hxs13551803230的博客-程序员信息网

&amp;lt;时钟篇&amp;gt;前述:对于DDR3的时钟说明,在做DDR3的存储之前有必要把各个时钟说明白搞明白,下面我讲的是对MIG(Xilinx)的时钟操作使用;  clock period时钟:在例化K7系列的MIG核时,作者通过仿真发现并且很明确的告诉你,这个时钟就是DDR3物理层的DDR3_CLK_P和DDR3_CLK_N的时钟,这个时钟的选择决定了DDR3存入和读取的带宽,一般根据项目的...

Java中的URLEncoder和URLDecoder类_wensonlee的博客-程序员信息网

为了解决DisplayTag的问题,可能要使用这2个类了,本篇继续分析URL编码的问题 以下内容是我翻译的JDK的帮助。URLEncoder类:用于HTML的form中数据编码的类。这个类包含将字符串转换为application/x-www-form-urlencoded MIME 格式的静态方法.如果想了解HTML的编码细则,请参考HTML规范。编码规...

关于vue ts项目同时引入element-ui和ant-design,ts报错不能编译的解决方法。_bob422720735的博客-程序员信息网_element modal 和ant design vue modal 冲突

vue ts版本同时引入ant和element不能打包。Subsequent property declarations must have the same type. Property ‘$confirm’ must be of type ‘(modalOptios: ModalOptions) =&gt; ModalConfirm’, but here has type ‘ElMessageBoxShortcutMethod’.Subsequent property declarations m

NLP 进行文本摘要的三种策略代码实现和对比:TextRank vs Seq2Seq vs BART_文本摘要代码_deephub的博客-程序员信息网

本文将使用 Python 实现和对比解释 NLP中的3 种不同文本摘要策略:老式的 TextRank(使用 gensim)、著名的 Seq2Seq(使基于 tensorflow)和最前沿的 BART(使用Transformers )。NLP(自然语言处理)是人工智能领域,研究计算机与人类语言之间的交互,特别是如何对计算机进行编程以处理和分析大量自然语言数据。最难的 NLP 任务是输出不是单个标签或值(如分类和回归),而是完整的新文本(如翻译、摘要和对话)的任务。文本摘要是在不改变其含义的情况下减少文档的

单元测试mockito参数匹配使用场景和注意项_CuteXiaoKe的博客-程序员信息网

  最近一直刚开始接触单元测试,也用了mockito框架,刚开始使用的话会遇到一些疑问,也会存在一些误区,所以在此记录一下使用mockito之参数匹配的问题。1.测试类场景  首先,我们来看一下我们要测试的类,主要分为Person人员信息类,它的里面有age属性;还有一个Salary工资类,里面有Pseron属性,getSalary是根据人员的getData的返回值进行盘代孕来返回工资的数值有..._1671465600

何利用streamlit快速搭建一个web应用并部署到heroku服务器上_李惨惨的博客-程序员信息网

如何利用streamlit快速搭建一个web应用并部署到heroku服务器上streamlit入门(所有的都一样安装包)尝试包的示例如何快速搭建你的webApp:1.首先在本地创建一个 .py文件,例如我的app.py2设置题目3设置控件:4 训练模型5从webApp中收集用户输入的信息,并打包成矩阵,输入自己已经建立好的模型:6写出自己模型的结果即可:部署注册一个账号:通过Heroku Git上传你的APP小结:参考:streamlit是一个用于构建机器学习、数据可视化的python框架。如果你想快速部

随便推点

python入门用spyder还是jupyter_Python开发环境Anaconda3使用指南(入门篇)_weixin_39637256的博客-程序员信息网

原标题:Python开发环境Anaconda3使用指南(入门篇)虽然说,我认为IDLE是世界上最美的Python开发环境,但是确实略显简陋,对Python内功(代码编写和调试)要求也高,并且每个扩展库都需要自己安装和配置,所以更多初学者和资深Python爱好者更偏向于使用Anaconda3、PyCharm或其他开发环境,而在众多Python开发环境中,Anaconda3因为集成安装大量扩展库,得到...

【Android开发】app升级报错,解析包时出现错误(华为手机8.0系统)_leafseelight的博客-程序员信息网_build version: v1.2.2 (5420) current date: 2023-02

问题描述:今天发布app版本升级,碰到华为手机8.0系统,安装升级的时候提示,解析包时出现问题。而其他手机都是正常的。而且当我的包没有经过360加固的时候,也是可以去升级新版本,加固过后就不行了。这个导致这个问题的原因有很多,我先把我这边app的问题处理方案介绍给大家。问题原因(360加固导致):360加固会导致代码执行时间差异,我在startIntent后调用了killProce...

IIS自动安装脚本_weixin_30632089的博客-程序员信息网

适用于win 7,win server [email protected] off echo 正在添加IIS功能,请稍等... start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-H...

各种距离的相似性度量_taodavid的博客-程序员信息网_切比雪夫距离完全一样

      分类时常常需要进行不同样本之间的相似性度量(SimilarityMeasurement),这时通常采用的方法是计算样本间的“距离”(Distance)。如何使用这些方法十分重要,甚至关系到分类的正确与否。距离包括:1.欧氏距离2.曼哈顿距离3. 切比雪夫距离4. 闵可夫斯基距离5.标准化欧氏距离6.马氏距离7.夹角余弦8.汉明距离9.杰卡德距

zabbix_3.0安装部署与中文支持_luoxq111的博客-程序员信息网

签:记录Zabbix 3.0界面焕然一新,一改10多年的老面孔,alpha4的更新具体记录如下:http://www.zabbix.com/rn3.0.0alpha4.phpWhat's New in 3.0.0alpha4[ZBXNEXT-1762] added years, months and half of months periods displayi

CSS-颜色属性+颜色函数+自定义变量_万少博的博客-程序员信息网

时间:2017年5月8日16:08:13    离开校园踏入职场,不是到达人生巅峰,而是人生才刚刚开始。校园里学的知识远不足工作需求,而且校园里的学习深度也比较浅显。因此,对于刚毕业前三年的工程师来说,马不停蹄不分昼夜的学习和汲取工作中需要用到的知识,是一个硬功夫,需要练就。兴趣是第一老师,有了兴趣工作才有激情和动力,因此,选择自己喜欢的一份工作比任何选择条件都要优先,永远将 喜欢 放在首

推荐文章

热门文章

相关标签