Unity游戏脚本简单学习
Unity游戏脚本
1、脚本操作游戏对象
1.1、创建游戏对象
- 创建一个空的游戏对象
GameObject obj = new GameObject("obj1");
用该方法创建一个空的游戏对象。该游戏体的名字为GameObject的参数值并且只有一个Transform组件。
2) 创建一个基本的游戏对象
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
该方法能创建的游戏体有Capsule、Cylinder、Cube、Plane、Quad、Sphere。该方法创建的游戏体属性和使用再Hierarchy视图下创建的游戏体属性相同。
3) 克隆创建游戏对象,比如创建一个prefab。
Instantiate(prefab);
该方法创建的游戏体的属性和prefab的属性相同。
1.2、获取游戏对象
- 通过游戏对象名字来查找
GameObject obj = Find("Cube");
GameObject obj = Find("Object/Cube");
该方法可以查找到游戏体的下一级的游戏体。
2) 通过tag来查找
GameObject obj = GameObject.FindGameObjectWithTag("Object"); //获取一个游戏对象
GameObject[] obj = GameObject.FindGameObjectsWithTag("Object"); //获取多个游戏对象
获取一个游戏对象时如果有多个游戏体的tag相同,则获取到的是第一个添加该标签的变量。
1.3、添加组件与修改组件
添加组件:
addComponent("Test");
添加一个Test脚本组件,该操作类似将Test.cs拖动到该游戏体的Inpsector视图中去。
修改组件:
Trasform t = GetComponent<Transform>();
t.x = 0;
t.y = 0;
t.z = 0;
使用GetComponent获取该组件的相关信息,修改里面的成员属性则可以达到修改组件的功能。
1.4、发送广播与消息
- 发送到子游戏体
gameObject.BroadcaseMessage("ReceiveBroadMessage", "aaa");void ReceiveBroadMessage(string str)
{Debug.Log(str);
}
发送消息的第一个参数为接收消息的方法名,第二个为接受的消息的内容,是一个Object类型。
- 给自己发送消息
gameObject.SendMessage("ReveiveMessage", "bbb");
- 向上一级游戏体发送消息
gameObject.SendMessageUpwards("ReceiveMessageUpwards", "ccc");
以上两个函数的参数与第一个函数的参数意思相同。
2、脚本控制对象变幻
2.1、改变游戏对象的位置
this.transform.position = new Vector3(10.0f, 10.0f, 10.0f);
通过this.transform.position
获取到游戏体在三维坐标系的位置。它存储在vector3容器中。直接修该position的值即可以修改游戏体的位置。
2.2、旋转游戏对象
this.transform.Rotate(Vector3.forward * Time.deltaTime * speed); //绕z轴旋转
this.transform.Rotate(Vector3.right * Time.deltaTime * speed); //绕x轴旋转
this.transform.Rotate(Vector3.up * Time.deltaTime * speed); //绕y轴旋转
2.3、平移游戏对象
this.transform.Translate(Vector3.forward * speed * Time.deltaTime); //向z轴正方向平移
this.transform.Translate(Vector3.right * speed * Time.deltaTime); //向x轴正方向平移
this.transform.Translate(Vector3.up * speed * Time.deltaTime); //向y轴正方向平移
2.4、缩放游戏对象
this.transform.localscale = new Vector3(2.0f, 2.0f, 2.0f);
该函数的功能是重新计算个方向上的缩放比例。
3、工具类
3.1、时间
- Time.time:表示游戏开始到现在共运行的游戏时间。
- Time.deltaTime:获取Update方法中完成上一帧所消耗的时间。
- Time.fixedTime:FixedUpdate方法中消耗的固定时间总和。
- Time.fixedDeltaTime:固定跟新上一帧所消耗的时间。
3.2、随机数
Random.Range(0, 100);
该函数的作用为获取第一个参数到第二个参数之间的一个数。
3.3、数学
- Mathf.Abs返回一个绝对值,其返回值为整形或浮点型。
- Mathf.Clamp返回一个限制值,限制参数1最小不超过参数2,最大不超过参数3.
- Martf.Lerp插入值,参数1表示开始的数值,参数2表示结束的数值,参数3表示所消耗的时间。
- Mathf.Sin返回正弦值。
- Mathf.Cos返回余弦值。
- Mathf.Tan返回正切值。
- Mathf.Max返回两个数的最大值。
- Mathf.Min返回两个数的最小值。
- Math.PI圆周率。
3.4、四元数
Quanertion.Euler()方法返回一个旋转的四元数,该方法中的参数表示的是旋转的角度。执行该方法后,即可在一帧内完成旋转。若想在一段时间内完成旋转,需要使用Quanertion.Slerp方法进行插值旋转。
4、脚本的生命周期
4.1、脚本绑定事件
Reset只在编辑模式下执行,当脚本绑定在游戏对象时或者点击Reset后调用。
#if UNITY_EDITOR
void Reset()
{Debug.Log("脚本绑定");
}
#endif
4.2、脚本初始化和销毁
脚本挂在游戏对象后,运行时就会立即执行初始化方法Awake()
, Start()
方法将在下一帧调用。如果游戏对象或者是挂在游戏对象身上的脚本被删除,就会执行OnDestroy()
销毁方法。初始化和销毁方法在脚本的生命周期中只会执行一次。
4.3、脚本的启用或者激活状态
在程序的运行中,可以多次设置激活/禁用状态,同时系统会分别回调生命周期中的OnEnable()
和OnDisable()
方法。
4.4、脚本更新与协程任务
在整个生命周期中,主要提供了下面3种更新方法。
- Update():每一帧执行时就会立即调用此方法。
- LateUpdate():Update方法执行后都会调用此方法。
- FixedUpdate():固定更新。默认情况下,系统每0.02s调用一次,具体的间隔时间可以在TimeManager中配置。
Update和LateUpdate属于立即更新,更新之间的频率时不固定的,如果某一帧有一个比较耗时的动作,将会影响到下一帧的更新。FixedUpdate虽然时固定更新,但是也会出现一帧耗时较长导致卡死的情况。但是相比较而言是FixedUpdate是相对固定的。
协程
Unity的脚本只支持单线程,不过它引入了协程的概念,可以用来模拟多线程,而不是真正的多线程。
void Start()
{StartCoroutine(CreateCube());
}IEnumerator CreateCube()
{for(int i=0; i<100; i++){GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = Vector3.one * i;yield return new WaitForSeconds(1f);}
}
在上面的程序中我们让系统每隔1s创建一个Cube。使用StartCoroutine()方法可以启动一个协程。yield return告诉Uinty等待多久执行下面的语句。
4.5、停止协程任务
每次启动协程时StartCoroutine函数会返回这个协程的对象。需要停止时使用StopCoroutine传入对象即可。也可以调用StopAllCoroutine停止这个脚本所启动的所有协程任务。
private Coroutine m_Coroutine = null;IEnumerator CreateCube()
{GameObject.CreatePrimitive(PrimitiveType.Cube);yield return new WaitForSeconds(1f);
}void Start()
{m_Coroutine = StartCoroutine(CreateCube());StopCoroutine(m_Coroutine);
}
5、多脚本管理
5.1、脚本的执行顺序
1)启动游戏后,Unity会同时处理所有的脚本。比如执行Awake方法时,Unity会先找到此时需要初始化的所有脚本,然后同时执行脚本的所有Awake方法。
2)脚本可以分为运行时动态添加到游戏对象上,和游戏运行前预知挂在游戏对象上。动态添加的脚本按添加的顺序觉得执行的顺序,静态的可以通过Script Execution Order中可以设置脚本的执行顺序。
3)这也说明了为什么Unity脚本提供了Start方法。如果A脚本先执行,而B脚本后执行,如果A脚本在Awake方法中调用了B脚本的数据,那么可能就会出错。因为B脚本的初始化还没有开始进行。所以Awake函数适合进行数据初始化,而Start函数适合访问别的脚本的数据。
5.2、多脚本优化
脚本挂的越多执行的效率越低。这些脚本都需要执行生命周期的方法,此时Unity需要遍历他们,然后再反射调用每个脚本的方法。所以我们优化的方法时避免挂载太多脚本,避免再脚本中写入空方法,如果不需要用,就把他删掉。
void Update()
{}
6、脚本编译
6.1、编译规则
脚本分为运行时脚本和编译时脚本两大类,运行时脚本最终会编译进游戏包中,而编辑时脚本仅用于编辑器模式下。优先编译Plugins目录下的脚本,然后再编译其他目录,最后会编译Editor目录下的脚本。先编译的脚本无法访问后编译的脚本。
6.2、优化编译
代码编译时,可能会出现等Unity编译DLL很久的问题,这样开发效率就会大打折扣。我们可以把框架类代码放在Plugins目录下,因为它不需要经常访问逻辑性的代码,这样当改动非Plugins目录下的逻辑性代码时就不会额外编译Plugins目录下的代码了。也可以把部分cs的代码预先编译成DLL,这样编译的速度就快了。
6.3、日志
Unity提供了Debug类来打印日志,常用的有:
Debug.Log("Log");
Debug.LogError("LogError");
Debug.LogWarning("LogWarning");
在开发阶段,多打印日志可以方便的查看程序的行为。但是一旦发布以后,一定要把日志关闭掉,因为打印日志会造成一些额外的开销。也可以在初始化的位置设置条件编译,在非编辑模式下运行时,关闭所有日志输出。
#if !UNITY_EDITORDebug.unityLogger.logEnabled = false;
#endif
Unity游戏脚本简单学习相关推荐
- nmap之nse脚本简单学习
nmap之nse脚本简单学习 环境:centos8 nmap安装 yum -y install nmap -- 版本 [root@qingchen /]# nmap -version Nmap ver ...
- 【Unity 工具,简单学习】DoTween,脚本控制动画工具
DOTween:脚本控制动画工具 简单介绍 安装 简单使用 eg.1 简单移动,跳动 eg2. 缓动 Easing(动画插值) eg3. 循环 Looping eg4. 变换颜色,变换大小 eg5. ...
- 使用PS为Unity游戏创建简单的游戏素材实例
在自己开发Unity游戏的过程中,偶然需要一些配合场景的合适的素材,但是在网上搜索费时费力,不称心,复杂的组件不说了,一些简单的组件就可以自己做一做.我在制作赛车游戏读取场景进程界面,需要一些简单的二 ...
- 基于傅老师unity游戏教学的学习笔记(EX)将PMX格式的MMD模型导入unity并使用
为了学习unity,开始游戏制作大业,我选择在bilibili上寻找unity游戏教学视频并边做边学,以此系列博客作为笔记. (EX)将PMX格式的MMD模型导入unity并使用 想做3D游戏,优秀的 ...
- Unity 游戏脚本
此为读书笔记,原创. Unity3D 游戏引擎中,游戏脚本以组件形式挂载在游戏对象上,并以此实现业务逻辑. Unity3D 游戏引擎中,所有脚本都派生自MonoBehaviour类. MonoBeha ...
- unity ui 补间动画_杭州Unity游戏开发培训内容有哪些?学习路线是如何规划的?...
现在Unity游戏开发行业越来越受到欢迎,但是想要找到适合自己的课程和学习方法却有些困难.很多刚开始接触Unity游戏开发且没有基础的同学,不知道该从哪里开始学,也不知道要学习什么内容.该怎么开始Un ...
- 最全面的Unity游戏开发指南视频教程 第2卷
最全面的Unity游戏开发指南视频教程 第2卷 流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小 ...
- C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例
C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...
- 《游戏脚本的设计与开发》-目录序
本系列文章目录 章节 标题 连接 序 游戏脚本简介 http://blog.csdn.net/lufy_legend/article/details/8888787 第一章 基本功能 1.1 读取和解 ...
最新文章
- 我看过的编译原理方面的好文章
- no.5_得到4升的水
- 全栈工程师对Python面试中is和==的区别做出解释!看完真的学到了
- Varnish Glossary(varnish术语)
- MySQL 表和列的注释的添加以及查看
- ssms排序代码_SSMS中的代码片段概述
- linux aix 环境,在AIX中设置中文环境
- 局域网Maven Java包批量上传的方法
- Java基础知识汇总
- 平面设计banner排版技巧哪些比较实用
- CVPR 2020 最佳论文提名 | 神经网络能否识别镜像翻转
- word中无法输入中文
- 玩转prometheus告警 alertmanger(二)之alertmanger 邮件 钉钉告警
- 【JavaScript】JavaScript模拟实现面向对象一张图帮助你深刻理解原型链和原型对象
- 思科网络设备终端和Telnet远程登录配置
- 考研英一----2006年真题知识点总结
- win 10 取消用户帐户控制
- “优必选“杯2021中国机器人技能大赛--赛后总结
- 初级***常备工具包大全
- sisoftware java测试_SiSoftware Sandra测试及全文总结_内存硬盘评测-中关村在线
热门文章
- 技术面试要做哪些准备?
- 贴纸拼词--动态规划
- 统计基础之差异性归一化正态分布
- 今天介绍一款事半功倍的Maya插件包
- Windows 下解决 VsCode 使用 SSH 连接报 Bad owner or permissions on C:\\Users\\Administrator/.ssh/config 错误
- GAMES101 作业0 环境配置 超详细小白教程
- 申请实用新型专利的流程
- java,判断一个整数是质数还是合数.
- win10 旗舰版 系统激活出现 在连接到本地注册表时出现错误0x80041002 提示信息 解决方法...
- matlab示波器横轴变纵轴,excel表格横轴数据变纵轴-在EXCEL中做图表,横坐标和纵坐标如何调换?...