Unity常用的基础 API

Transform

Transform组件的成员变量

组件名称 组件作用
position 世界坐标中的位置
localPosition 父对象局部坐标系中的位置
enlerAngles 世界坐标系中以欧拉角表示的旋转
localEulerAngles 父对象局部坐标系中的欧拉角
right 对象在世界坐标系中的右方向
up 对象在世界坐标系中的上方向
forward 对象在世界坐标系中的前方向
rotation 世界坐标系中以以元数表示的旋转
localRotation 父对象局部坐标系中以四元数表示的旋转
localScale 父对象局部坐标系中的缩放比例
parent 父对象的Transform组件

Transform组件的成员函数

组件名称 组件作用
Translate 按指定的方向和距离平移
Rotate 按指定的欧拉角旋转
RotateAround 按给定旋转轴和旋转角度进行旋转
LookAt 旋转使得自身的前方向指向目标的位置
TransformDirection 将一个方向从局部坐标变换到世界坐标系
InverseTransformDirection 将一个方向从世界坐标系变换到局部坐标系
TransformPoint 将一个位置从局部坐标系变量换到世界坐标系
InverseTransformPoint 将一个位置从世界坐标系变换到局部坐标系
Find 按名称查找子对象
IsChildOf 判断是否是指定对象的子对象

transform.Rotate

1
2
3
4
5
6
7
8
//Update is called once per frame0个引用
void Update() {
// transform.Rotate(new Vector3(10,0,0));
//transform.Rotate(new Vector3(0,1,0),10);
//以自身为坐标系进行旋转,这时候跟自身坐标系有很大关系
//transform.Rotate(new Vector3(10,0,0),Space.Self);
transform.Rotate(10,0,0, Space.World);
}
  1. 按照API要求的参数进行数值传递;
  2. Space.Self 和 Space.World 区别:
    • Space.Self以自身为参考系来进行旋转;
    • Space.World 是以世界坐标系为参考系的;

transform.RotateAround

游戏物体绕某一个点沿着某个轴进行旋转

1
transform.RotateAround(target.transform.position, Vector3.up, 10);

游戏物体绕某一个点沿着某个轴进行旋转

Transform.Translate

1
2
3
4
5
6
// transform.position += new Vector3(0.01f,0,0);
//transform. ranslate(new Vector3(0.01f,0, 0), Space.World);
//第一个参数是移动的量第二个参数:移动方向的参考系
//transform.Translate(new Vector3(0.01f,0,0), target.transform);
transform.Translate(0.01f,0,0, target.transform);

Translate移动增量,如果需要移动游戏物体,就需要写在update里

LookAt

1
2
3
4
5
//看向目标游戏物体,当前游戏物体的z轴方向指向目标方向
transform.LookAt (target.transform);
//调试使用的划线
Debug.DrawLine(transform. position,target.transform.position, Color.red) ;

GameObject和Transform

在代码中更深入理解GameObject和Transform

1
2
3
4
public GameObject target;
public Transform target_transform;
transform.parent = target.transform;
transform.parent = target_transform;

因为GameObject肯定有Transform组件,所有这样做target.transform;
因为Transform不能独立存在,必然存活于游戏物体,所以可以这样做target_transform.gameObject;

设置父物体

1
2
3
4
5
6
//target.transform
//target_transform.game0bject
//transform.parent = target.transform;
//transform.parent = target_transform;
transform.SetParent(target_transform);
transform.SetParent(target.transform);

查找子物体

  • Transform查找子物体API:
  • transform.childCount:子物体的数量;
  • transform.GetChild(i);根据index来查找子物体,特性:子物体的子物体是不会管的;
1
2
3
Transform t = transform.Find("Cube (2)");
if (t != null)
Debug.Log("t:" + t.name);

根据游戏物体的名字来进行精确查找;也不会搜索子物体的子物体;

GameObject

通过名字查找游戏物体

1
2
3
4
5
6
GameObject go = GameObject.Find("GameObject");
if (go)
Debug.Log("go:" + go.name);
else
Debug.Log("没有找到");
GameObject.Find("GameObject");

能根据游戏物体名字在所有场景内游戏物体中查找,好用但是效率很低,谨慎使用;

通过Tag来进行查找游戏物体

1
2
3
4
5
6
7
8
9
10
11
//当有多个tag是NPC的时候。查找到的是最后创建的tag是NPC的游戏物体
//查找游戏物体tag是NPC
Game0bject go = GameObject.FindGame0bjectWithTag ("NPC");
if (go)
Debug.Log("go:"+ go.name);
//当游戏场景中有多个游戏物体tag是NPC,同时查找到,并返回一个游戏物体数组
Game0bject[] gos = GameObject.FindGameObjectsWithTag("NPC");
for (int i =0; i< gos. Length; i++)
{
Debug. Log("name:" + gos[i].name);
}

Time

Time的静态变量

静态变量 变量作用
captureDeltaTime 减慢游戏播放时间,以便在帧之间保存屏幕截图。
captureFramerate Time.captureDeltaTime 的倒数。
deltaTime 完成上一帧所用的时间(以秒为单位)(只读)。
fixedDeltaTime 执行物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)的时间间隔(以秒为单位)。
fixedTime 最近一次 FixedUpdate 已启动的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。
fixedTimeAsDouble 最近一次 FixedUpdate 已启动的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。
fixedUnscaledDeltaTime 从上一个固定帧到当前固定帧的独立于 timeScale 的时间间隔(以秒为单位)(只读)。
fixedUnscaledTime 最近一次 FixedUpdate 已启动的独立于 TimeScale 的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。
fixedUnscaledTimeAsDouble 最近一次 FixedUpdate 已启动的独立于 TimeScale 的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。
frameCount 已经过的总帧数(只读)。
inFixedTimeStep 如果在固定时间步长回调(如 MonoBehaviour 的 FixedUpdate)内调用,则返回 true,否则返回 false。
maximumDeltaTime 帧可以耗用的最长时间。物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)将仅在每帧的该持续时间内执行。
maximumParticleDeltaTime 帧可以在粒子更新上耗用的最长时间。如果帧耗用的时间超过该值,则将更新拆分为多个较小的更新。
realtimeSinceStartup 游戏开始以来的实际时间(只读)。
realtimeSinceStartupAsDouble The real time in seconds since the game started (Read Only). Double precision version of realtimeSinceStartup. This offers more precision than a float or single value, particularly over extended periods of real-world time. In almost all cases, choose the realtimeSinceStartupAsDouble equivalent over realtimeSinceStartup.
smoothDeltaTime 经过平滑处理的 Time.deltaTime(只读)。
time 该帧开始的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。
timeAsDouble 该帧开始的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。
timeScale 时间流逝的标度。可用于慢动作效果。
timeSinceLevelLoad 该帧开始以来的时间(只读)。此为自加载上一个关卡以来的时间(以秒为单位)。
timeSinceLevelLoadAsDouble 该帧开始以来的时间(只读)。此为自加载上一个关卡以来的时间(以秒为单位)。
unscaledDeltaTime 从上一帧到当前帧的独立于 timeScale 的时间间隔(以秒为单位)(只读)。
unscaledTime 该帧的独立于 timeScale 的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。
unscaledTimeAsDouble 该帧的独立于 timeScale 的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。

Time.deltaTime

  • 关于 Time.deltaTime 的使用:表示距离上一帧的执行所耗费的时间,0到1小数(秒)。
  • 具体使用场景:场景中的游戏对象在移动或旋转时,默认速度较快,所以一般做法是参数乘以自己定义的一个小数以此来降低速度。但出现deltaTime后,小数可使用此来替代,也就是直接乘以Time.delta 也一样可以实现了;
    普通更新操作放在 Update()中,但Update() 方法每一帧与每一帧执行时耗用时间不相同,如何解决呢?前提是不能写在 FixedUpdate()中,可以这样:直接乘以 Time.deltaTime 便可实现该功能

匀速移动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ObjTrans1Script : MonoBehaviour {
//声明变量speed,表示移动速度
private float speed;
void Start ()
{
//为speed变量赋值操作
speed = 2.5f ;
}
// Update()以帧为单位更新场景
void Update () {
//实现cube向前移动操作.注意:
/*Time.deltaTime是按照每秒来统计.
*通常:Time.deltaTime*一个数字,
表示让这个*物体以每秒钟**米的速度移动而不是每帧*米**/
transform.Translate(Vector3.forward*Time.deltaTime*speed);
}

匀速旋转

实现物体在一个匀速的速度下旋转,不依赖帧的速率。核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
using UnityEngine ;
using System.Collections ;
public class example:MonoBehaviour
{
void Update()
{
//以y轴为中心进行旋转,每次旋转5个单位
transform.Rotate(05 * Time.deltaTime,0);
}
}

timeScale

timeScale实现游戏暂停
使用 Time.timeScale 一般可制作游戏中暂停的效果。

Random

Random静态变量

静态变量 变量作用 作用汉译
insideUnitCircle Returns a random point inside a circle with radius 1 (Read Only). 随机返回一个半径为1的圆内的点(只读)。
insideUnitSphere Returns a random point inside a sphere with radius 1 (Read Only). 随机返回一个半径为1的球体内的点(只读)。
onUnitSphere Returns a random point on the surface of a sphere with radius 1 (Read Only). 随机返回一个单位球体表面上的点(只读)。
rotation Returns a random rotation (Read Only). 随机返回一个(用四元数表示的)角度(只读)。
rotationUniform Returns a random rotation with uniform distribution (Read Only). 随机返回一个均匀分布的旋转角度(只读) 。
seed Sets the seed for the random number generator. 给随机数发生器设置种子。
value Returns a random number between 0.0 [inclusive] and 1.0 [inclusive] (Read Only). 返回一个0.0(包括)到1.0(包括)之间的随机数(只读)。

Random静态函数

静态函数 变量作用
ColorHSV 通过 HSV 和 Alpha 范围生成随机颜色。
InitState 使用种子初始化随机数生成器状态。

Mathf 类

在 Unity 中封装了数学类 Mathf,使用它可以轻松地解决复杂的数学公式。Mathf 类提供了常用的数学运算,下表列出了常用的 Mathf 类变量和方法,完整的资料请参阅用户手册。

SmoothDamp()

SmoothDamp()制作相机跟踪效果
Mathf.SmoothDamp() 方法可以制作相机的跟踪效果,让物体的移动不是那么僵硬而是做减速的缓冲效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Mathf.SmoothDampAngle() 平滑阻尼角度 
static function SmoothDampAngle (
current :float,
target : float,
ref currentVelocity : float,
smoothTime : float,
maxSpeed : float = Mathf.Infinity,
deltaTime : float = Time.deltaTime
)

//float  参数 
//current  当前的位置。
//target  我们试图达到的位置。 
//currentVelocity  当前速度,这个值在你访问这个函数的时候会被随时修改。 
//smoothTime  the target faster.  要到达目标位置的近似时间,实际到达目标时要快一些。 
//maxSpeed  可选参数,允许你限制的最大速度。 
//deltaTime  上次调用该函数到现在的时间。缺省为Time.deltaTime。 

制作相机跟踪效果

随着时间的推移逐渐改变一个给定的角度到期望的角度。 
这个值通过一些弹簧减震器类似的功能被平滑。
这个函数可以用来平滑任何一种值,位置,颜色,标量。最常见的是平滑一个跟随摄像机。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//一个简单的平滑跟随摄像机  
//跟随目标的朝向 
public class example : MonoBehaviour {             
publicTransform target;             
publicfloat smooth = 0.3F;             
publicfloat distance = 5.0F;             
privatefloat yVelocity = 0.0F;             
voidUpdate()

//从目前的y角度变换到目标y角度                         
floatyAngle = Mathf.SmoothDampAngle(transform.eulerAngles.y, target.eulerAngles.y,ref yVelocity, smooth); 
//target的位置                         
Vector3position = target.position; 
//然后,新角度之后的距离偏移                         
position+= Quaternion.Euler(0, yAngle, 0) * new Vector3(0, 0, -distance); 
//应用位置                         
transform.position= position; 
//看向目标                         
transform.LookAt(target);             

}

Input

键盘输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//当A键摁下瞬间执行一次
if (Input.GetKeyDown(KeyCode.A))
{
Debug.Log("A");
}
//B键摁下时执行,执行次数大于1
if(Input.GetKey(KeyCode.B))
{
Debug. Log("B");
}
//C键被摁下抬起时瞬间执行一次
if (Input.GetKeyUp(KeyCode.C))
{
Debug.Log("C");
}

鼠标输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//0:代表的是鼠标左键
//1:代表的是鼠标右键
//2:代表的是鼠标中键
if (Input.GetMouseButton(1))
{
Debug.Log(1);
}
if (Input.GetMouseButton(2))
{
Debug.Log(2);
}
if (Input.GetMouseButton(0))
{
Debug.Log(0);
}

摇杆输入(轴值获取)

一般我们称输入轴为, Axis,又叫虚拟轴。 
输入轴(虚拟轴)用于模拟一些游戏外设平滑变化的输入。
例如:模拟鼠标、键盘、摇杆、方向盘等外设的输入变化。具体如何模拟呢,其实就是开发人员根据用户平时使用外设的一些习惯,在编程时将这些习惯映射为外设上的一些虚拟按键,日后使用时可直接按虚拟按键便可使用对应的功能。
输入轴需要通过 Input Manager 输入管理器中进行配置。
它包含两个虚拟按键(Positive Button 和 Negative Button)。

1
2
3
4
5
6
7
8
//摁下A键从0到-1会有很多随机的小数,渐变到-1
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Debug.Log("h:"+ h+",V:"+v);
//值在-1 0 1三个值之间切换,不会有中间值进行渐变
float h1 = Input.GetAxisRaw("Horizontal");
float v1 = Input.GetAxisRaw("Vertical");
Debug.Log("h1:" + h1 +",V1:"+ v1);

按键检测

1
2
3
4
5
//检测鼠标左键
if (Input.GetButtonDown("Fire1"))
{
Debug.Log("Fire1");
}

输入管理器

前面在使用 Input.GetAxis( 参数 )时,我们使用过4个参数:Mouse X 、Mouse Y、Horizontal、Vertical。
这几个参数值其实是Unity默认定义好的,我们也可以自行再使用其它熟识单词;
另外,我们也可以创建映射了特殊功能的虚拟按键,这些操作,都需要在输入管理器(Input Manager)中配置。

打开输入管理器

Edit-->Project Settings-->Input Manager
在右侧 Inspector面板中点击“Axes”,则会显示出Unity2017.3.默认的定义好的25个虚拟按键(版本不同,个数也不同)。

访问组件

在实际代码中,经常需要访问游戏对象的各种组件并为组件设置参数。对于系统内置的常用组件,Unity提供了非常便利的访问方式,只需要在脚本里直接访问组件对应的成员变量即可,这些成员变量定义在 MonoBehviour 中并被继承了下来

常用组件

常用组件及其变量,如下表所示:

组件名称 变量名 组件作用
Transform transform 设置对象的位置、旋转、缩放
Rigidbody rigidbody 设置物理引擎的刚体属性
Renderer renderer 渲染物体模型
Light light 设置灯光属性
Camera camera 设置相机属性
Collider colider 设置碰撞体属性
Animation animation 设置动画属性

访问组件的方法

如果要访问的组件不属于上表中,或者访问的是游戏上的脚本(脚本属于自定义组件),则可以通过以下方法来得到引用:

GetComponent 得到组件
GetComponents 得到组件(用于有多个同类型组件的时候)
GetComponentlnChildren 得到对象或对象子物体上的组件
GetComponentslnChildren 得到对象或对象上物体上的组件列表