前言

这个文档的内容来源于我一年多前的学习笔记。

Unity的版本也同时在飞速的提升,因此文章中可能会存在过时的API,请各位看客以各版本的官方文档为准。

大家可以通过“Ctrl+F”进行API检索

常用API汇总

关于Input

Input.GetKey(); //按下某键后,持续返回true

Input.GetKeyDown(); //按下某键的一瞬间,返回true

Input.GetKeyUp(); //抬起某键的一瞬间,返回true

返回值:bool 类型

参数:KeyCode.枚举(Enum)

KeyCode:键码,保存了物理键盘按键“索引码”。

Input.GetMouseButton(); //按下某键后,持续返回true

Input.GetMouseButtonDown(); //按下某键的一瞬间,返回true

Input.GetMouseButtonUp(); //抬起某键的一瞬间,返回true

返回值:bool 类型

参数:鼠标按键索引值,0->左键, 1->右键, 2->中键。

关于Rigidbody

Rigidbody.MovePosition(Vector3):使用刚体移动物体的位置。

使用刚体移动物体,物体是根据世界坐标系的方向移动的。

使用刚体移动物体,物体会触发物理相关的事件。

MovePosition 中的Vector3 要使用“当前位置”+ 方向的方式。

Transform.Position:属性当前的位置。

Rigidbody.MovePosition(Vector3):使用刚体移动物体的位置。

使用刚体移动物体,物体是根据世界坐标系的方向移动的。

使用刚体移动物体,物体会触发物理相关的事件。

MovePosition 中的Vector3 要使用“当前位置”+ 方向的方式。

Transform.Position:属性当前物体的位置。

AddForce():给刚体添加一个力,让刚体按“世界坐标系”进行运动。

Rigidbody.AddForce(Vector3,ForceMode);

Vector3:力的方向和大小;

ForceMode:力的模式[enum 类型]。

类型为枚举类型,以什么样的方式添加力给刚体。

枚举值说明

Acceleration:(加速度);

Force:(力)这种模式通常用于设置真实的物理;

Impulse:(冲击力)这种模式通常用于瞬间发生的力;

VelocityChange:(速度的变化);

AddRelativeForce():给刚体添加一个力,让刚体按“自身坐标系”进行运动。

Rigidbody.AddRelativeForce(Vector3,ForceMode);

Vector3:力的方向和大小;

ForceMode:力的模式[enum 类型]。

Update与FixedUpdate

FixedUpdate():固定更新方法。

所有和物理相关的操作,代码都要写在FixedUpdate()方法体内。

固定更新的时间间隔是0.02 秒,1 秒执行50 次。

Edit-->Project Settings-->Time 面板中的Fixed Timestep 参数设置。

Update():每帧执行一次。

画面每渲染完一次,就是一帧,每帧的时间是不固定的。

在Update()方法中执行物理操作,会出现卡顿的情况。

碰撞事件监测方法

OnCollisionEnter(Collision)

当碰撞开始时调用,只会调用该方法一次。

OnCollisionExit(Collision)

当碰撞结束时调用,只会调用该方法一次。

OnCollisionStay(Collision)

当碰撞进行中时,会持续调用该方法。

Collision 参数

碰撞,一个类。

作用:用于传递碰撞信息(要写形式参数 比如Collision coll)

Collision.gameObject 属性,与当前物体碰撞的物体的引用。

gameObject.name 属性,当前物体的名字。

比如coll.gameObject.name就是获取当前物体碰撞物体的名字

触发事件监测方法

触发器:将碰撞体组件属性面板上的“Is Trigger”选项选中,当前的游戏物体的碰撞体

就变成了触发器。

移动的刚体物体会穿透碰撞体勾选了“Is Trigger”的物体。

OnTriggerEnter(Collider)

当进入触发范围时开始时调用,只会调用该方法一次。

OnTriggerExit(Collider)

当离开触发范围时开始调用,只会调用该方法一次。

OnTriggerStay(Collider)

在触发范围内,会持续调用该方法。

Collider 参数(和Collision参数相似)

碰撞体,一个类。作用:用于传递触发信息。

Collider.gameObject 属性,进入触发范围内的目标物体的引用。

gameObject.name 属性,当前物体的名字。

鼠标事件方法

OnMouseEnter() :鼠标进入

OnMouseExit() :鼠标离开

OnMouseDown() :鼠标按下[单击]

更换颜色

变量.color = color.颜色;

AudioSource 常用函数

Play() 函数

播放音频剪辑。

Stop() 函数

停止播放。

Pause() 函数

暂停播放。

通过Tag 标签查找N 个物体

GameObject.FindGameObjectsWithTag(string):[静态方法]

通过特定的标签,查找到所有“贴有”该标签的游戏物体,返回一个数组。

String:标签名

查找游戏物体

GameObject.Find(string):[静态方法] 通过名字查找游戏物体

String 游戏物体的名字

FindGameObjectWithTag返回的是一个数组,要定义一个数组来储存,

Find只是查找某一个物体(可以继续点出下面的组件)

旋转物体

使用Transform.Rotate(Vector3,float)旋转物体:

Vector3:沿某个轴向旋转

Float:旋转的度数

实例化生存物体

GameObject.Instantiate(Object, Vector3, Quaternion);

Object:用于实例化的预制体;

Vector3:实例化后生成的物体所在的位置;

Quaternion[四元数]:实例化后生成的物体的旋转状态;

Quaternion.identity:无旋转;

生成随机数

Random.Range(min, max)

在min 和max 直接随机生成一个随机数。

销毁游戏物体

GameObject.Destroy(Object, float);定时销毁某个游戏物体。

Object:要销毁的游戏物体;

float:时间,多少秒后销毁;

发送信息

SendMessage 函数

gameObject.SendMessage(string):通知这个游戏物体身上的脚本文件中的“指定方法”执行。

String:方法名,要执行的方法的名字

延迟执行

Invoke(string,float):多少秒后执行某个函数[只会调用一次]。

String:要执行的函数的名称;

Float:秒数,倒计时的时间;

InvokeRepeating(string,float,float):

多少秒[第二个参数]后执行某个函数,

并且以后每隔多少秒[第三个参数]都会执行该函数一次[重复调用N 次]。

String:要执行的函数的名称;

Float:秒数,准备时间,预热时间;

Float:秒数,重复调用的间隔时间;

CancelInvoke():取消这个脚本中所有的Invoke 调用。

协同程序

协同程序就是一个“代码片段”,

往往我们需要将这个代码片段封装成一个方法,或者称之为函数。

协程全称协同程序,与线程类似,每一个应用程序都对应一个进程,每一个进程都有一个主线程,而协程在主线程之中,

因而使用了还是单线程,不能理解为多线程,应是主线程的一部分。

常用于使用动画时同步代码,时间等待,资源加载,场景切换等等

IEnumerator Task3()

{

yield return new WaitForSeconds (2);

Debug.Log ("任务3");

}

参数说明:

IEnumerator:协同程序的返回值类型;

yield return:协同程序返回xxxxx;

new WaitForSeconds (秒数):实例化一个对象,等待多少秒后继续执行。

开启协同程序

StartCoroutine(“协同程序方法名”);

这个StartCoroutine 有三种重载形式,目前先只介绍这一种。

停止协同程序

StopCoroutine(“协同程序方法名”);

这个StopCoroutine 也有三种重载形式,目前先只介绍这一种。

Screen 屏幕类

作用:这个类中包含屏幕相关的数据信息。

类中常用属性

Screen.width:静态只读属性,屏幕的宽度。

Screen.height:静态只读属性,屏幕的高度。

备注:在Unity 的开发模式下,这两个值取的是Game 窗口的宽度和高度。

在项目编译打包后,再运行,就是具体的设备的屏幕的宽度和高度。

Time 时间类作用

这个类中包含时间相关的数据信息。

类中常用属性:

Time.time

静态只读属性,游戏时间。从游戏开始到现在所经过的秒数。

Time.deltaTime

静态只读属性,时间增量。渲染完上一帧画面所消耗的时间。

[可以用于实现倒计时效果]

Time.timeScale

静态属性,时间缩放。[可以用于暂停游戏]

当值为1 时,游戏是正常状态;为0 时,游戏是暂停状态;为0.5 时,游戏是

处于慢放0.5 倍的状态。

Mathf 数学类

作用:这个类(其实Mathf 是结构体类型)中包含了各种各样的数学运算相关的函数。

常用函数

Mathf.Abs() 取绝对值

Mathf.Max() 取最大值

Mathf.Min() 取最小值

Mathf.Round() 四舍五入

插值运算函数

Mathf.Lerp(float a,float b,float t) :插值运算

基于浮点数t 返回a 到b 之间的插值,t 限制在0~1 之间。

当t = 0 返回a,当t = 1 返回b。当t = 0.5 返回a 和b 的平均值。

备注:Lerp()这个函数,在很多类中都存在,

插值运算的目的基本都是为了“平滑过渡”。

通过摄像机创建射线

Camera.main:代表tag 设置为“MainCamera”的摄像机的Camera 组件的引用。

m_Camera.ScreenPointToRay(Vector3):

摄像机组件(对象)下的一个方法。

屏幕点转化为射线,这个方法会返回一个Ray 类型的射线。

这个屏幕点通常写鼠标的点击位置,这样的话,就代表从摄像机的位置开始,往

鼠标点击点这个方向,发射一根射线。

Input.mousePosition:鼠标所在的位置值。

Ray:射线,一个结构体。

代码完整格式:

ray = Camera.main.ScreenPointToRay(Input.mousePosition);

检查射线与其他物体的碰撞

RaycastHit

一个结构体,用于存储射线的碰撞信息。

Physics.Raycast(Ray, out RaycastHit)

物理类下面有一个静态方法叫做Raycast(),射线检查。

这个方法有16 个重载方式,我们现在使用第3 种重载方式。

第3 种重载:

检查这根射线,如果射线与场景中的物理碰撞了,返回值为真,并且将碰撞信息

存储到RaycastHit 类型的变量中。

物理射线使用步骤

第一步:创建一根射线。

第二步:检查这根射线与其他物体的碰撞,得到碰撞信息。

第三步:通过碰撞信息对碰撞到的物体进行处理。

射线碰撞检测发射子弹

RaycastHit.point

获取射线碰撞点。

Vector3 向量计算方向:

向量A - 向量B = 一个从B 点到A 点的方向。

也就是说,终点减去起点,可以获取到一个从起点到终点的方向。

Debug 绘制射线

射线是“虚无”的一个东西,就和WIFI 信号一样,真实存在,但我们看不到。

但有些时候,我们需要看到射线。

Debug.DrawRay(Vector3, Vector3,Color):绘制射线

第一个Vector3 是起点位置;

第二个Vector3 是目的点减去起点得到的一个方向;

Color 就是射线的显示颜色。

注意:Debug 绘制的射线,只能在Scene 窗口看到,运行后看不到。

如果想在运行后也看到,可以使用LineRenderer 组件绘制。

Debug 绘制测试线

枪口到碰撞点直接绘制一根测试线。

Debug.DrawLine(Vector3, Vector3, Color):绘制线

和Debug.DrawRay()用法一样。

Transform.LookAt(Vector3):朝向(面向)世界中的一个点。

场景背景模型添加碰撞器组件

添加Mesh Collider 组件,使用简模进行碰撞检测。

模型减面

简模模型的作用:降低物理运算资源消耗,提高游戏性能;

Vertices(verts):顶点个数,Mesh 网格是由顶点组成面,面组成体。

顶点个数越少,计算量越小。

在当前物体的子物体中查找游戏物体

Transform.FindChild(string)

枪口位置添加LineRenderer 组件

在枪口这个空游戏物体上添加LineRenderer 组件,设置相关属性。

LineRenderer.SetPosition(int,Vector3):设置线的位置。

int:位置的索引值;

Vector3:该位置所在的坐标值;

父子关系、获取组件

Transform.parent:属性,当前物体的父物体。

Transform.GetComponentsInChildren();:获取所有子物体的某个组件。

GameObject.AddComponent();:给游戏物体添加组件。

Transform.SetParent(Transform);:将当前的物体设置为另一个物体的子物体。

GameObject.GetComponent().localScale = Vector3.one;:重置物体的大小。

GameObject.GetComponent();:查找组件(一般前面需要用一个变量来储存)

实例化资源

GameObject uiSprite = new GameObject("Monkey");:创建(实例化)一个名字叫做Monkey的对象(后面可以uiSprite.来代替GameObject,GameObject代表装载在当前组件的游戏物体)

Resources.Load(); :读取在名字叫做Resources文件夹里面的资源

参考资料

官方文档

擅码网