Unity游戏脚本

1、脚本操作游戏对象

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、获取游戏对象

  1. 通过游戏对象名字来查找
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、发送广播与消息

  1. 发送到子游戏体
gameObject.BroadcaseMessage("ReceiveBroadMessage", "aaa");void ReceiveBroadMessage(string str)
{Debug.Log(str);
}

发送消息的第一个参数为接收消息的方法名,第二个为接受的消息的内容,是一个Object类型。

  1. 给自己发送消息
gameObject.SendMessage("ReveiveMessage", "bbb");
  1. 向上一级游戏体发送消息
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游戏脚本简单学习相关推荐

  1. nmap之nse脚本简单学习

    nmap之nse脚本简单学习 环境:centos8 nmap安装 yum -y install nmap -- 版本 [root@qingchen /]# nmap -version Nmap ver ...

  2. 【Unity 工具,简单学习】DoTween,脚本控制动画工具

    DOTween:脚本控制动画工具 简单介绍 安装 简单使用 eg.1 简单移动,跳动 eg2. 缓动 Easing(动画插值) eg3. 循环 Looping eg4. 变换颜色,变换大小 eg5. ...

  3. 使用PS为Unity游戏创建简单的游戏素材实例

    在自己开发Unity游戏的过程中,偶然需要一些配合场景的合适的素材,但是在网上搜索费时费力,不称心,复杂的组件不说了,一些简单的组件就可以自己做一做.我在制作赛车游戏读取场景进程界面,需要一些简单的二 ...

  4. 基于傅老师unity游戏教学的学习笔记(EX)将PMX格式的MMD模型导入unity并使用

    为了学习unity,开始游戏制作大业,我选择在bilibili上寻找unity游戏教学视频并边做边学,以此系列博客作为笔记. (EX)将PMX格式的MMD模型导入unity并使用 想做3D游戏,优秀的 ...

  5. Unity 游戏脚本

    此为读书笔记,原创. Unity3D 游戏引擎中,游戏脚本以组件形式挂载在游戏对象上,并以此实现业务逻辑. Unity3D 游戏引擎中,所有脚本都派生自MonoBehaviour类. MonoBeha ...

  6. unity ui 补间动画_杭州Unity游戏开发培训内容有哪些?学习路线是如何规划的?...

    现在Unity游戏开发行业越来越受到欢迎,但是想要找到适合自己的课程和学习方法却有些困难.很多刚开始接触Unity游戏开发且没有基础的同学,不知道该从哪里开始学,也不知道要学习什么内容.该怎么开始Un ...

  7. 最全面的Unity游戏开发指南视频教程 第2卷

    最全面的Unity游戏开发指南视频教程 第2卷 流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小 ...

  8. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

  9. 《游戏脚本的设计与开发》-目录序

    本系列文章目录 章节 标题 连接 序 游戏脚本简介 http://blog.csdn.net/lufy_legend/article/details/8888787 第一章 基本功能 1.1 读取和解 ...

最新文章

  1. 我看过的编译原理方面的好文章
  2. no.5_得到4升的水
  3. 全栈工程师对Python面试中is和==的区别做出解释!看完真的学到了
  4. Varnish Glossary(varnish术语)
  5. MySQL 表和列的注释的添加以及查看
  6. ssms排序代码_SSMS中的代码片段概述
  7. linux aix 环境,在AIX中设置中文环境
  8. 局域网Maven Java包批量上传的方法
  9. Java基础知识汇总
  10. 平面设计banner排版技巧哪些比较实用
  11. CVPR 2020 最佳论文提名 | 神经网络能否识别镜像翻转
  12. word中无法输入中文
  13. 玩转prometheus告警 alertmanger(二)之alertmanger 邮件 钉钉告警
  14. 【JavaScript】JavaScript模拟实现面向对象一张图帮助你深刻理解原型链和原型对象
  15. 思科网络设备终端和Telnet远程登录配置
  16. 考研英一----2006年真题知识点总结
  17. win 10 取消用户帐户控制
  18. “优必选“杯2021中国机器人技能大赛--赛后总结
  19. 初级***常备工具包大全
  20. sisoftware java测试_SiSoftware Sandra测试及全文总结_内存硬盘评测-中关村在线

热门文章

  1. 技术面试要做哪些准备?
  2. 贴纸拼词--动态规划
  3. 统计基础之差异性归一化正态分布
  4. 今天介绍一款事半功倍的Maya插件包
  5. Windows 下解决 VsCode 使用 SSH 连接报 Bad owner or permissions on C:\\Users\\Administrator/.ssh/config 错误
  6. GAMES101 作业0 环境配置 超详细小白教程
  7. 申请实用新型专利的流程
  8. java,判断一个整数是质数还是合数.
  9. win10 旗舰版 系统激活出现 在连接到本地注册表时出现错误0x80041002 提示信息 解决方法...
  10. matlab示波器横轴变纵轴,excel表格横轴数据变纵轴-在EXCEL中做图表,横坐标和纵坐标如何调换?...