unity--3D-课件-第02章-Unity脚本程序基础知识_第1页
unity--3D-课件-第02章-Unity脚本程序基础知识_第2页
unity--3D-课件-第02章-Unity脚本程序基础知识_第3页
unity--3D-课件-第02章-Unity脚本程序基础知识_第4页
unity--3D-课件-第02章-Unity脚本程序基础知识_第5页
已阅读5页,还剩20页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第1页 第2页Unity中的脚本分为不同的方法,不同的方法在特定中的脚本分为不同的方法,不同的方法在特定的情况下被回调会实现特定的功能。的情况下被回调会实现特定的功能。Start方法:这个方法在游戏场景加载时被调用,在方法:这个方法在游戏场景加载时被调用,在该方法内可以写一些游戏场景初始化之类的代码。该方法内可以写一些游戏场景初始化之类的代码。Update方法:这个方法会在每一帧渲染之前被调用,方法:这个方法会在每一帧渲染之前被调用,大部分游戏代码在这里执行,除了物理部分的代码。大部分游戏代码在这里执行,除了物理部分的代码。FixedUpdate方法:这个方法会在固定的物理时间方法:这个方法会

2、在固定的物理时间步调调用一次。这里也是基本物理行为代码执行的步调调用一次。这里也是基本物理行为代码执行的地方。地方。第3页继承自继承自MonoBehaviour类。类。类名字必须匹配文件名。类名字必须匹配文件名。Unity脚本中协同程序有不同的语法规则。脚本中协同程序有不同的语法规则。只有满足特定情况变量才能显示在属性查看器中。只有满足特定情况变量才能显示在属性查看器中。尽量避免使用构造函数尽量避免使用构造函数第4页2.3.1 位移与旋转位移与旋转位移与旋转:在位移与旋转:在Unity中对游戏对象的操作都是通过脚本来修中对游戏对象的操作都是通过脚本来修改游戏对象的改游戏对象的Transform

3、(变换属性)与(变换属性)与Rigidbody(刚体(刚体属性)参数来实现的。这些参数的修改是通过脚本编程来实属性)参数来实现的。这些参数的修改是通过脚本编程来实现的。现的。具体开发流程如下。具体开发流程如下。(1)创建)创建Cube对象。点击对象。点击GameObject3D ObjectCube,创建一个,创建一个Cube对象作为本案例案例对象,对象作为本案例案例对象,可以在左侧面板点击可以在左侧面板点击Cube查看其相关属性。查看其相关属性。(2)编写脚本。在)编写脚本。在Assets面板点击面板点击CreateC# Script,创,创建一个建一个C#脚本,并将其命名为脚本,并将其命名

4、为BUNTrans,然后编写脚本。,然后编写脚本。(3)挂载脚本。脚本开发完成后,将这个脚本挂载到游戏)挂载脚本。脚本开发完成后,将这个脚本挂载到游戏对象上对象上 。 第5页2.3.1 位移与旋转位移与旋转1 using UnityEngine;2 using System.Collections;/引入系统包引入系统包3 public class BNUTransR : MonoBehaviour /声明类声明类4 void Update()/重写重写Update方法方法5 this.transform.Rotate(2,0,0);/绕绕x轴每帧旋转轴每帧旋转26 1 using Unity

5、Engine;2 using System.Collections; /引入系统包引入系统包3 public class BNUTransT : MonoBehaviour/声明类声明类4 void Update()/重写重写Update方法方法5 this.transform.Translate(0, 0, 1); /物体每帧沿物体每帧沿z轴移动轴移动1个单位长度个单位长度6 第6页2.3.2 记录时间记录时间需要用到记录时间需要用到Time类类 ,Time类中比较重要的变类中比较重要的变量为量为deltaTime它指的是从最近一次调用它指的是从最近一次调用Update或者或者FixedUp

6、date方法到现在的时间方法到现在的时间 具体开发流程如下。具体开发流程如下。(1)创建)创建Cube对象。点击对象。点击GameObject3DObjectCube (2)编写脚本。在)编写脚本。在Assets面板点击面板点击CreateC# Script。(3)挂载脚本。脚本开发完成后,将这个脚本挂载)挂载脚本。脚本开发完成后,将这个脚本挂载到游戏对象上到游戏对象上 。 第7页2.3.2 记录时间1 using UnityEngine;2 using System.Collections;/引入系统包引入系统包3 public class BNUTime : MonoBehaviour/声

7、明类声明类4 void Update()/重写重写Update方法方法5 this.transform.Rotate(10 * Time.deltaTime, 0, 0);/绕绕x轴均匀旋转轴均匀旋转6 第8页2.3.3 访问游戏对象组件在在Unity中组件属于游戏对象,组件(中组件属于游戏对象,组件(Component)其实是用来绑定)其实是用来绑定到游戏对象(到游戏对象(Game Object)上的一组相关属性。本质上每个组件是)上的一组相关属性。本质上每个组件是一个类的实例。常见的组件有:一个类的实例。常见的组件有:MeshFilter、MeshCollider、Renderer、Ani

8、mation等等。等等。组件名称变量名称组件名称变量名称TransformtransformRigidbodyrigidbodyRendererrendererCameraCamera(只在摄像机对象有效)LightLight(只在光源对象有效)AnimationanimationCollidercollider第9页2.3.3 访问游戏对象组件1 using UnityEngine;2 using System.Collections; /引入系统包引入系统包3 public class BNUComponent : MonoBehaviour /声明类声明类4 void Update()/

9、重写重写Update方法方法5 transform.Translate(1, 0, 0); /沿沿x轴移动一个单位轴移动一个单位6 GetComponent().Translate(1, 0, 0); /沿沿x轴移动一个单位轴移动一个单位7 第10页2.3.4 访问其它游戏对象1、通过属性查看器指定参数、通过属性查看器指定参数2、确定对象的层次关系、确定对象的层次关系3、通过名字或标签获取游戏对象、通过名字或标签获取游戏对象4、通过组件名称获取游戏对象、通过组件名称获取游戏对象第11页2.3.5 向量3D游戏开发中经常需要用到向量和向量的运算,比如上述介绍游戏开发中经常需要用到向量和向量的运算

10、,比如上述介绍的物体的位移和旋转等,的物体的位移和旋转等,Unity中提供了完整的用来表示二维向中提供了完整的用来表示二维向量的量的Vector2类和表示三维向量的类和表示三维向量的Vector3类。类。 Vector3类中常量对应的值类中常量对应的值常量值常量值Vector3.zeroVector(0,0,0)Vector3.oneVector(1,1,1)Vector3.forwardVector(0,0,1)Vector3.upVector(0,1,0)Vector3.rigthVector(1,0,0)第12页2.3.5 向量方法作用Lerp两个向量之间的线性插值。Slerp在两个向量

11、之间进行球形插值。OrthoNormalize使向量规范化并且彼此相互垂直。MoveTowards从当前的位置移向目标。RotateTowards当前的向量转向目标。Scale两个矢量组件对应相乘。Cross两个向量的交叉乘积。Dot两个向量的点乘积。Reflect沿着法线反射向量。Distance返回两点之间的距离。Project投影一个向量到另一个向量。Angle返回两个向量的夹角。Min返回两个向量中长度较小的向量。Max返回两个向量中长度较大的向量。operator +两个向量相加operator -两个向量相减operator *两个向量相乘operator /两个向量相除opera

12、tor =两个向量是否相等operator !=两个向量是否不相等ClampMagnitude返回向量的长度,最大不超过maxLength所指示的长度。SmoothDamp随着时间的推移,逐渐改变一个向量朝向预期的目标。第13页2.3.6 成员变量和全局变量定义在方法体外的变量是成员变量,可以在属性查看器看到,读者可定义在方法体外的变量是成员变量,可以在属性查看器看到,读者可以随时在属性查看器中修改它的值。通过以随时在属性查看器中修改它的值。通过private创建的变量是私有变创建的变量是私有变量,这些在属性查看器中就不会显示该变量量,这些在属性查看器中就不会显示该变量 第14页2.3.6 成

13、员变量和全局变量1 using UnityEngine;2 using System.Collections; /引入系统包引入系统包3 public class BNUPubvar : MonoBehaviour/声明类声明类 public Transform pubTrans;/声明一个公有声明一个公有Transform组件组件5 private Transform priTrans;/声明一个私有声明一个私有Transform组件组件6 void Start()/重新重新Start方法方法7 priTrans = this.transform;/为为priTrans赋值赋值8 9 voi

14、d Update()/重写重写Update方法方法10 if (Vector3.Distance(pubTrans.position, priTrans.position) 10) /如果如果ren和和transform的距离小于的距离小于1011 Debug.Log(pubTrans.position);/打印打印pubTrans的位置的位置12第15页2.3.7 实例化游戏对象Unity中如果想创建游戏对象,可以通过创建游戏对象菜单在场景中进行,如果想创建很多相同的物体(例如射击出去的子弹,保龄球瓶等)时,可以通过实例化(Instantiate)快速实现 第16页2.3.7 实例化游戏对象

15、1 using UnityEngine;2 using System.Collections; /引入系统包3 public class BNUIns : MonoBehaviour/声明类4 public Transform prefab;/定义公有的对象5 public void Awake()/重写Awake方法6 int i = 0;/定义计数标志位7 while (i 5)/重复5次8 Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity);/实例化对象9 i+;/标志位自加10第17页2.3.8 协

16、同程序和中断协同程序,即在主程序运行时同时开启另一段逻辑处协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。但它与多线程程序不同,理,来协同当前程序的执行。但它与多线程程序不同,所有的协同程序都是在主线程中运行的,它还是一个所有的协同程序都是在主线程中运行的,它还是一个单线程程序。在单线程程序。在Unity中可以通过中可以通过StartCoroutine方方法来启动一个协同程序。法来启动一个协同程序。终止一个协同程序可以使用终止一个协同程序可以使用StopCoroutine(string methodName),而使用,而使用StopAllCoroutines()是用来是

17、用来终止所有可以终止的协同程序,但这两个方法都只能终止所有可以终止的协同程序,但这两个方法都只能终止该终止该MonoBehaviour中的协同程序。中的协同程序。第18页2.3.8 协同程序和中断1 using UnityEngine;2 using System.Collections; /引入系统包3 public class BNUCoroutine : MonoBehaviour/声明类4 IEnumerator Start() /重写Start方法5 StartCoroutine(DoSomething, 2.0F); /开启协同程序6 yield return new WaitFo

18、rSeconds(1);/等待1s7 StopCoroutine(DoSomething); /中断协同程序 8 IEnumerator DoSomething(float someParameter)/声明DoSomething方法9 while (true)/开始循环10 print(DoSomething Loop);/打印提示信息11 yield return null; 第19页2.3.9 一些重要的类1. MonoBehaviour类类MonoBehaviour类是类是C#脚本的基类,其继承自脚本的基类,其继承自Behaviour类。在类。在C#脚本中,必须直接或间接的继承脚本中,

19、必须直接或间接的继承MonoBehaviour类类 2. Transform类类场景中的每一个物体都有一个场景中的每一个物体都有一个Transform组件,它就组件,它就是是Transform类实例化的对象。用于储存并操控物体类实例化的对象。用于储存并操控物体的位置、旋转和缩放。每一个的位置、旋转和缩放。每一个Transform可以有一个可以有一个父级,允许分层次应用位置、旋转和缩放。可以在父级,允许分层次应用位置、旋转和缩放。可以在Hierarchy面板查看层次关系。面板查看层次关系。Transform类中包含类中包含了很多的成员变量了很多的成员变量 第20页2.3.9 一些重要的类3. R

20、igidbody类类Rigidbody组件可以模拟物体在物理效果下的状态,它就是组件可以模拟物体在物理效果下的状态,它就是Rigidbody类实例化的对象。它可以让物体接受力和扭矩,让类实例化的对象。它可以让物体接受力和扭矩,让物体相对真实地移动。如果一个物体想被重力所约束,其必须物体相对真实地移动。如果一个物体想被重力所约束,其必须含有含有Rigidbody组件。组件。Rigidbody类中包含了很多的成员变量类中包含了很多的成员变量 4. CharacterController类类角色控制器是角色控制器是CharacterController类的实例化对象,用于第类的实例化对象,用于第三人

21、称或第一人称游戏角色控制。它可以根据碰撞检测判断是三人称或第一人称游戏角色控制。它可以根据碰撞检测判断是否能够移动,而不必添加刚体和碰撞器。而且角色控制器不会否能够移动,而不必添加刚体和碰撞器。而且角色控制器不会受到力的影响。受到力的影响。CharacterController类包含了很多的成员变类包含了很多的成员变量量 第21页2.3.10 性能优化1. 缓存组件查询缓存组件查询当通过当通过GetComponent获取一个组件时,获取一个组件时,Unity必须必须从游戏物体里查找目标组件,如果是在从游戏物体里查找目标组件,如果是在Update方法方法中进行查找,就会影响运行速度。此时可以设置

22、一个中进行查找,就会影响运行速度。此时可以设置一个私有变量去储存这个组件。私有变量去储存这个组件。 第22页2.3.10 性能优化1 using UnityEngine;2 using System.Collections; /引入系统包引入系统包3 public class BNUyh1 : MonoBehaviour /声明类声明类4 private Transform m_transform;/声明静态变量声明静态变量5 void Start () /重写重写Start方法方法6 m_transform = this.transform;/为静态变量赋值为静态变量赋值7 8 void U

23、pdate () /重写重写Update方法方法9 m_transform.Translate(new Vector3(1,0,0);/沿沿x轴每帧移动一米轴每帧移动一米10第23页2.3.10 性能优化2. 使用内建数组使用内建数组我们在开发的过程中不可避免的使用到数组,虽然我们在开发的过程中不可避免的使用到数组,虽然ArrayList和和Array使用起来容易并且方便,但是相比使用起来容易并且方便,但是相比较内建数组而言,前者和后者的速度还是有很大的差较内建数组而言,前者和后者的速度还是有很大的差异。内建数组直接嵌入异。内建数组直接嵌入struct数据类型存入第一缓冲数据类型存入第一缓冲区里,不需要其他类型信息或者其他资源,因此用作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论