介绍
此文档来自 简问 游戏开发频道
平台 | 帐号 |
---|---|
bilibili | |
QQ 群 | |
抖音 | |
知乎 | |
小红书 | |
知识星球 | |
西瓜视频 |
Vector3
表示三维向量和点的数据类型,用于传递 3D 位置和方向。
方法 | 说明 |
---|---|
Distance | 计算两点间距离 |
Angle | 计算两向量间角度 |
Normalize | 对向量进行标准化(归一化) |
Vector3.Distance
计算两点间距离。
定义
public static float Distance(Vector3 a, Vector3 b);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
a | Vector3 | 是 | a 点 |
b | Vector3 | 是 | b 点 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public Transform target;
private bool IsClose()
{
if (!target) return false;
var distance = Vector3.Distance(transform.position, target.position);
return distance < 10.0f;
}
}
Vector3.Angle
计算两向量间角度
定义
public static float Angle(Vector3 from, Vector3 to);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
from | Vector3 | 是 | 源向量 |
to | Vector3 | 是 | 目标向量 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public Transform target;
private bool IsAiming()
{
var playerTransform = transform;
var targetDir = target.position - playerTransform.position;
var angle = Vector3.Angle(targetDir, playerTransform.forward);
return angle < 5.0f;
}
}
Vector3.Normalize
对向量进行标准化,使其方向保持不变,但长度变为 1.0,这个过程也称为归一化。
定义
public static Vector3 Normalize(Vector3 value);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
value | Vector3 | 是 | 待归一化向量 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public Transform target;
private void Update()
{
var direction = target.position - transform.position;
direction.Normalize();
transform.Translate(direction * Time.deltaTime);
}
}
Quaternion
四元数,用于表示旋转。
方法 | 说明 |
---|---|
Euler | 将欧拉角转为四元数 |
Quaternion.Euler
将欧拉角转换为四元数
定义
public static Quaternion Euler (float x, float y, float z);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
x | float | 是 | X 轴旋转度数 |
y | float | 是 | Y 轴旋转度数 |
z | float | 是 | Z 轴旋转度数 |
public static Quaternion Euler (Vector euler);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
euler | Vector3 | 是 | 表示 X、Y、Z 三轴旋转度数的向量 |
using UnityEngine;
public class Example : MonoBehaviour
{
private void Start()
{
var rotationX = 0;
var rotationY = 30;
var rotationZ = 0;
var rotationVector = new Vector3(rotationX, rotationY, rotationZ);
var rotation = Quaternion.Euler(rotationX, rotationY, rotationZ);
var rotation = Quaternion.Euler(rotationVector);
}
}
Input
鼠标
方法 | 说明 |
---|---|
GetMouseButton | 每一帧鼠标处于按下状态返回 true |
GetMouseButtonDown | 鼠标按下的那一帧返回 true |
GetMouseButtonUp | 鼠标抬起的那一帧返回 true |
键盘
方法 | 说明 |
---|---|
GetButton | 每一帧键盘处于按下状态返回 true |
GetButtonDown | 键盘按下的那一帧返回 true |
GetButtonUp | 键盘抬起的那一帧返回 true |
GetKey | 每一帧键盘处于按下状态返回 true |
GetKeyDown | 键盘按下的那一帧返回 true |
GetKeyUp | 键盘抬起的那一帧返回 true |
Input.GetMouseButton
每一帧鼠标处于按下状态都会返回 true
定义
public static bool GetMouseButton(int button);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
button | int | 是 | 按键对应数字0 :鼠标左键1 :鼠标右键2 :鼠标中键 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
private void Update()
{
if (Input.GetMouseButton(0))
Debug.Log("鼠标左键处于按下状态");
if (Input.GetMouseButtonDown(0))
Debug.Log("已按下鼠标左键");
if (Input.GetMouseButtonUp(0))
Debug.Log("已抬起鼠标左键");
}
}
Input.GetMouseButtonDown
鼠标按下的那一帧返回 true
定义
public static bool GetMouseButtonDown(int button);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
button | int | 是 | 按键对应数字0 :鼠标左键1 :鼠标右键2 :鼠标中键 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
private void Update()
{
if (Input.GetMouseButton(0))
Debug.Log("鼠标左键处于按下状态");
if (Input.GetMouseButtonDown(0))
Debug.Log("已按下鼠标左键");
if (Input.GetMouseButtonUp(0))
Debug.Log("已抬起鼠标左键");
}
}
Input.GetMouseButtonUp
鼠标抬起的那一帧返回 true
定义
public static bool GetMouseButtonUp(int button);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
button | int | 是 | 按键对应数字0 :鼠标左键1 :鼠标右键2 :鼠标中键 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
private void Update()
{
if (Input.GetMouseButton(0))
Debug.Log("鼠标左键处于按下状态");
if (Input.GetMouseButtonDown(0))
Debug.Log("已按下鼠标左键");
if (Input.GetMouseButtonUp(0))
Debug.Log("已抬起鼠标左键");
}
}
Input.GetButton
每一帧键盘处于按下状态都会返回 true
定义
public static bool GetButton(string buttonName);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
buttonName | string | 是 | 按键对应字符串,如 "Jump" 、"Mouse X" ,只能为在 InputManager 中定义的轴键,可在 Unity 窗口 Editor > Project Settings > Input Manager 中找到。 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float fireDelta = 1.0f; // 开火间隔
private float _myFireDelta;
private void Start()
{
_myFireDelta = fireDelta;
}
private void Update()
{
_myFireDelta -= Time.deltaTime; // 减少冷却
if (Input.GetButtonDown("Fire1"))
Debug.Log("已按下开火");
// 按下开火并且冷却完成
if (Input.GetButton("Fire1") && _myFireDelta <= 0)
{
Debug.Log("正在开火...");
_myFireDelta = fireDelta; // 开火后重置冷却时间
}
if (Input.GetMouseButtonUp(0))
Debug.Log("已停止开火");
}
}
Input.GetButtonDown
键盘按下的那一帧返回 true
定义
public static bool GetButtonDown(string buttonName);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
buttonName | string | 是 | 按键对应字符串,如 "Jump" 、"Mouse X" ,只能为在 InputManager 中定义的轴键,可在 Unity 窗口 Editor > Project Settings > Input Manager 中找到。 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float fireDelta = 1.0f; // 开火间隔
private float _myFireDelta;
private void Start()
{
_myFireDelta = fireDelta;
}
private void Update()
{
_myFireDelta -= Time.deltaTime; // 减少冷却
if (Input.GetButtonDown("Fire1"))
Debug.Log("已按下开火");
// 按下开火并且冷却完成
if (Input.GetButton("Fire1") && _myFireDelta <= 0)
{
Debug.Log("正在开火...");
_myFireDelta = fireDelta; // 开火后重置冷却时间
}
if (Input.GetMouseButtonUp(0))
Debug.Log("已停止开火");
}
}
Input.GetButtonUp
键盘抬起的那一帧返回 true
定义
public static bool GetButtonUp(string buttonName);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
buttonName | string | 是 | 按键对应字符串,如 "Jump" 、"Mouse X" ,只能为在 InputManager 中定义的轴键,可在 Unity 窗口 Editor > Project Settings > Input Manager 中找到。 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float fireDelta = 1.0f; // 开火间隔
private float _myFireDelta;
private void Start()
{
_myFireDelta = fireDelta;
}
private void Update()
{
_myFireDelta -= Time.deltaTime; // 减少冷却
if (Input.GetButtonDown("Fire1"))
Debug.Log("已按下开火");
// 按下开火并且冷却完成
if (Input.GetButton("Fire1") && _myFireDelta <= 0)
{
Debug.Log("正在开火...");
_myFireDelta = fireDelta; // 开火后重置冷却时间
}
if (Input.GetMouseButtonUp(0))
Debug.Log("已停止开火");
}
}
Input.GetKey
每一帧键盘处于按下状态都会返回 true
定义
public static bool GetKey(string name);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 按键对应代码,详见 附录 #按键名称表 |
public static bool GetKey(KeyCode key);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
key | KeyCode | 是 | 按键对应字符串名称,详见 附录 #按键代码表 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float number = 0.0f;
private void Update()
{
if (Input.GetKeyDown("up"))
{
number += 1.0f;
Debug.Log(number);
}
else if (Input.GetKeyDown("down"))
{
number -= 1.0f;
Debug.Log(number);
}
}
}
Input.GetKeyDown
键盘按下的那一帧返回 true
定义
public static bool GetKeyDown(string name);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 按键对应代码,详见 附录 #按键名称表 |
public static bool GetKeyDown(KeyCode key);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
key | KeyCode | 是 | 按键对应字符串名称,详见 附录 #按键代码表 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float number = 0.0f;
private void Update()
{
if (Input.GetKeyDown("up"))
{
number += 1.0f;
Debug.Log(number);
}
else if (Input.GetKeyDown("down"))
{
number -= 1.0f;
Debug.Log(number);
}
}
}
Input.GetKeyUp
键盘抬起的那一帧返回 true
定义
public static bool GetKeyUp(string name);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 按键对应代码,详见 附录 #按键名称表 |
public static bool GetKeyUp(KeyCode key);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
key | KeyCode | 是 | 按键对应字符串名称,详见 附录 #按键代码表 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float number = 0.0f;
private void Update()
{
if (Input.GetKeyDown("up"))
{
number += 1.0f;
Debug.Log(number);
}
else if (Input.GetKeyDown("down"))
{
number -= 1.0f;
Debug.Log(number);
}
}
}
附录
按键名称表
-
字母键:
"a"
、"b"
、"c"
…… -
数字键:
"1"
、"2"
、"3"
…… -
箭头键:
"up"
、"down"
、"left"
、"right"
-
小键盘键:
"[1]"
、"[2]"
、"[3]"
、"[+]"
、"[equals]"
…… -
修改键:
"right shift"
、"left shift"
、"right ctrl"
、"left ctrl"
、"right alt"
、"left alt"
、"right cmd"
、"left cmd"
-
特殊键:
"backspace"
、"tab"
、"return"
、"escape"
、"space"
、"delete"
、"enter"
、"insert"
、"home"
、"end"
、"page up"
、"page down"
-
功能键:
"f1"
、"f2"
、"f3"
……
按键代码表
按键对应代码,可在 官方文档 中查看全部。
KeyCode.W
:"w" 键KeyCode.A
:"a" 键KeyCode.S
:"s" 键KeyCode.D
:"d" 键KeyCode.Space
:空格键KeyCode.Mouse0
:鼠标左键
Time
属性 | 说明 |
---|---|
deltaTime | 帧间隔时间(秒) |
time | 游戏自启动以来的时间(秒) |
timeScale | 时间流逝速度缩放 |
Time.deltaTime
上一帧到当前帧的时间间隔(秒)
定义
public static float deltaTime;
倒数计时器,按下按钮即可从 60 秒倒数,再次点击按钮可以暂停。
using UnityEngine;
using UnityEngine.UI;
public class ExampleScript : MonoBehaviour
{
public float timeStart = 60f;
public Text textBox;
public Text startBtnText;
private bool _timerActive;
private void Start()
{
textBox.text = timeStart.ToString("00");
}
private void Update()
{
if (!_timerActive) return;
timeStart -= Time.deltaTime;
textBox.text = timeStart <= 0 ? "Over" : timeStart.ToString("00");
}
public void TimerButton()
{
_timerActive = !_timerActive;
startBtnText.text = _timerActive ? "Pause" : "Start";
}
}
-
使用每帧时间累加,来进行游戏计数。
-
让运动的物体,在相同的时间内保持平均的速度进行运动(引入增量时间;将数值乘以
Time.deltaTime
后,可使得此内容在Update()
中执行时,无论游戏的帧率是多少,结果依然在分布上与时间有关。)
Time.timeScale
时间流逝速度缩放。
默认为 1
,大于 1
加速,小于 1
减速,0
表示暂停,负值被忽略。
可用于慢动作效果或加速效果。
定义
public static float timeScale;
对 Time.deltaTime 中示例的补充,添加了一个滑块控制时间的流逝速度。
using UnityEngine;
using UnityEngine.UI;
public class ExampleScript : MonoBehaviour
{
public float timeStart = 60f;
public Text textBox;
public Text startBtnText;
public Slider timeScaleSlider;
private bool _timerActive;
private void Start()
{
textBox.text = timeStart.ToString("00");
timeScaleSlider.minValue = 0.5f;
timeScaleSlider.maxValue = 2;
timeScaleSlider.value = 1;
}
private void Update()
{
if (!_timerActive) return;
timeStart -= Time.deltaTime;
textBox.text = timeStart <= 0 ? "Over" : timeStart.ToString("00");
}
public void TimerButton()
{
_timerActive = !_timerActive;
startBtnText.text = _timerActive ? "Pause" : "Start";
}
public void TimeScaleSliderChanged()
{
Time.timeScale = timeScaleSlider.value;
}
}
Time.time
游戏自启动以来的时间(秒)。
定义
public static float time;
与 Time.deltaTime 中的示例不同,此处使用 Time.time
实现了一个新的倒数计时器,并且可以控制计数间隔
using UnityEngine;
using UnityEngine.UI;
public class ExampleScript : MonoBehaviour
{
public float timeStart = 60f;
public Text textBox;
public Text startBtnText;
public float interval = 3f; // 间隔
private float _nextTick;
private bool _timerActive;
private void Start()
{
textBox.text = timeStart.ToString("00");
}
private void Update()
{
if (!_timerActive || Time.time < _nextTick) return;
timeStart -= interval;
_nextTick = Time.time + interval;
textBox.text = timeStart <= 0 ? "Over" : timeStart.ToString("00");
}
public void TimerButton()
{
_timerActive = !_timerActive;
startBtnText.text = _timerActive ? "Pause" : "Start";
}
}
CharacterController
利用 CharacterController 组件,可以更容易地处理有碰撞的运动,同时不需处理刚体。
方法 | 说明 |
---|---|
SimpleMove | 传入表示各方向移动速度的 Vector3 类型参数 speed ,使物体移动 |
Move | 传入表示各方向移动增量值的 Vector3 类型参数 motion ,使物体移动。 |
isGrounded | 判断物体是否在地面 |
CharacterController.SimpleMove
传入表示各方向移动速度的 Vector3 类型参数 speed
,使物体移动。
其中 Y 轴会被忽略,重力自动应用。
返回角色物体是否在地面上。
定义
public bool SimpleMove(Vector3 speed);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
speed | Vector3 | 是 | 各方向移动速度,单位为 units/s ,Y 轴会被忽略。 |
简单的人物控制器,左右键旋转,前后键移动。
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class ExampleScript : MonoBehaviour
{
public float moveSpeed = 2.0f; // 移动速度
public float rotateSpeed = 2.0f; // 旋转速度
private CharacterController _controller;
private void Start()
{
_controller = GetComponent<CharacterController>();
}
private void Update()
{
// 旋转
transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);
// 前进后退
var forward = transform.TransformDirection(Vector3.forward);
var curSpeed = moveSpeed * Input.GetAxis("Vertical");
_controller.SimpleMove(forward * curSpeed);
}
}
CharacterController.Move
传入表示各方向移动增量值的 Vector3 类型参数 motion
,使物体移动。
与 SimpleMove 不同的是,它是增量值而不是速度,且可以控制 Y 轴。
定义
public CollisionFlags Move(Vector3 motion);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
motion | Vector3 | 是 | 各方向移动的绝对增量值 |
一个简单的第一人称控制器
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class ExampleScript : MonoBehaviour
{
public float moveSpeed = 2.0f; // 移动速度
public float sensitivity = 2f; // 鼠标灵敏度
private CharacterController _controller;
private float _ySpeed;
private void PlayerRotate()
{
var mouseX = Input.GetAxis("Mouse X") * sensitivity;
transform.Rotate(Vector3.up * mouseX);
}
private void PlayerMove()
{
var motion =
transform.right * Input.GetAxis("Horizontal") +
transform.forward * Input.GetAxis("Vertical");
motion *= moveSpeed;
_controller.Move(motion * Time.deltaTime);
}
private void Start()
{
_controller = GetComponent<CharacterController>();
}
private void Update()
{
PlayerRotate();
PlayerMove();
}
}
CharacterController.isGrounded
判断物体是否在地面上,但只有在移动中才进行检测。(在最后的移动中是否触地)
定义
public bool isGrounded;
这是对 CharacterController.Move 中示例的补充,添加了跳跃功能。
由于使用 Move 而不是 SimpleMove,所以需要自己处理重力。
using System;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class ExampleScript : MonoBehaviour
{
public float moveSpeed = 2.0f; // 移动速度
public float gravity = 9.8f; // 重力大小
public float jumpHeight = 2f; // 跳跃高度
public float sensitivity = 2f; // 鼠标灵敏度
private CharacterController _controller;
private float _ySpeed; // Y 轴速度
private void PlayerRotate()
{
var mouseX = Input.GetAxis("Mouse X") * sensitivity;
transform.Rotate(Vector3.up * mouseX);
}
private void PlayerMove()
{
var motion =
transform.right * Input.GetAxis("Horizontal") +
transform.forward * Input.GetAxis("Vertical");
motion *= moveSpeed;
// 跳跃
switch (_controller.isGrounded)
{
case true when Input.GetKeyDown(KeyCode.Space):
_ySpeed = (float) Math.Sqrt(2 * gravity * jumpHeight);
break;
case true:
_ySpeed = 0;
break;
case false:
_ySpeed -= gravity * Time.deltaTime; // 重力
break;
}
motion += transform.up * _ySpeed;
_controller.Move(motion * Time.deltaTime);
}
private void Start()
{
_controller = GetComponent<CharacterController>();
}
private void Update()
{
PlayerRotate();
PlayerMove();
}
}
上述示例也许并不好用,因为 isGrounded
只有角色移动时(调用 SimpleMove
或 Move
时)才会进行检测,并且 CharacterController
的 Skin Width
也会对其影响。
建议自己实现地面检测功能,方法有多种,这里使用最简单的 Raycast
,关于 Raycast
的用法在 Physics/Raycast 中有介绍。
private bool IsGrounded()
{
var playTransform = transform;
var origin = playTransform.position - new Vector3(0, 1f, 0); // 人物胶囊体底部
return Physics.Raycast(origin, -playTransform.up, 0.01f, groundLayer); // 发射长度为 0.01 的射线,判断是否与地面相交
}
将 IsGrounded
替代原本代码中的 _controller.isGrounded
,全部代码如下:
using System;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class ExampleScript : MonoBehaviour
{
public float moveSpeed = 2.0f; // 移动速度
public float gravity = 9.8f; // 重力大小
public float jumpHeight = 2f; // 跳跃高度
public float sensitivity = 2f; // 鼠标灵敏度
public LayerMask groundLayer; // 地面层级
private CharacterController _controller;
private float _ySpeed; // Y 轴速度
private void PlayerRotate()
{
var mouseX = Input.GetAxis("Mouse X") * sensitivity;
transform.Rotate(Vector3.up * mouseX);
}
private void PlayerMove()
{
var motion =
transform.right * Input.GetAxis("Horizontal") +
transform.forward * Input.GetAxis("Vertical");
motion *= moveSpeed;
// 跳跃
switch (IsGrounded())
{
case true when Input.GetKeyDown(KeyCode.Space):
_ySpeed = (float) Math.Sqrt(2 * gravity * jumpHeight);
break;
case true:
_ySpeed = 0;
break;
case false:
_ySpeed -= gravity * Time.deltaTime; // 重力
break;
}
motion += transform.up * _ySpeed;
_controller.Move(motion * Time.deltaTime);
}
private bool IsGrounded()
{
var playTransform = transform;
var origin = playTransform.position - new Vector3(0, 1f, 0); // 人物胶囊体底部
return Physics.Raycast(origin, -playTransform.up, 0.01f, groundLayer); // 发射长度为 0.01 的射线,判断是否与地面相交
}
}
private void Start()
{
_controller = GetComponent<CharacterController>();
}
private void Update()
{
PlayerRotate();
PlayerMove();
}
}
Transform
物体的位置、旋转和缩放
方法 | 说明 |
---|---|
Rotate | 旋转物体 |
Translate | 改变物体位置 |
LookAt | 面向某一物体 |
Transform.Rotate
旋转物体
定义
public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
eulers | Vector3 | 是 | 表示旋转的欧拉角 |
relativeTo | Space | 否 | 相对的坐标系,默认 Space.Self Space.Self :局部坐标系Space.World :世界坐标系 |
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
xAngle | float | 是 | X 轴旋转角度 |
yAngle | float | 是 | Y 轴旋转角度 |
zAngle | float | 是 | Z 轴旋转角度 |
relativeTo | Space | 否 | 相对的坐标系,默认 Space.Self Space.Self :局部坐标系Space.World :世界坐标系 |
public void Rotate(Vector3 axis, float angle, Space relativeTo = Space.Self);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
axis | Vector3 | 是 | 旋转所绕轴 |
angle | float | 是 | 旋转角度 |
relativeTo | Space | 否 | 相对的坐标系,默认 Space.Self Space.Self :局部坐标系Space.World :世界坐标系 |
该示例代码创建了两个不同的立方体:红色立方体按照局部座标系 Space.Self
旋转;绿色立方体按照世界座标系 Space.World
旋转。
通过改变面板中的 xAngle
、yAngle
、zAngle
控制旋转角度。
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float xAngle, yAngle, zAngle;
private GameObject _cube1, _cube2;
private void Awake()
{
_cube1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
_cube1.transform.position = new Vector3(0.75f, 0.0f, 0.0f);
_cube1.transform.Rotate(90.0f, 0.0f, 0.0f, Space.Self);
_cube1.GetComponent<Renderer>().material.color = Color.red;
_cube1.name = "Self";
_cube2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
_cube2.transform.position = new Vector3(-0.75f, 0.0f, 0.0f);
_cube2.transform.Rotate(90.0f, 0.0f, 0.0f, Space.World);
_cube2.GetComponent<Renderer>().material.color = Color.green;
_cube2.name = "World";
}
private void Update()
{
cube1.transform.Rotate(xAngle, yAngle, zAngle, Space.Self);
cube2.transform.Rotate(xAngle, yAngle, zAngle, Space.World);
}
}
Transform.Translate
改变物体位置
定义
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
translation | Vector3 | 是 | 移动方向和大小 |
relativeTo | Space | 否 | 相对的坐标系,默认 Space.Self Space.Self :局部坐标系Space.World :世界坐标系 |
public void Translate(float x, float y, float z, Space relativeTo = Space.Self);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
x | float | 是 | X 轴移动大小 |
y | float | 是 | Y 轴移动大小 |
z | float | 是 | Z 轴移动大小 |
relativeTo | Space | 否 | 相对的坐标系,默认 Space.Self Space.Self :局部坐标系Space.World :世界坐标系 |
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
private void Update()
{
// 让物体沿自身 z 轴移动,每秒一个单位长度
transform.Translate(Vector3.forward * Time.deltaTime);
// 让物体沿世界方向向上移动,每秒一个单位长度
transform.Translate(Vector3.up * Time.deltaTime, Space.World);
}
}
指定各轴大小进行移动
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
private void Update()
{
// 让物体沿自身 z 轴移动,每秒一个单位长度
transform.Translate(0, 0, Time.deltaTime);
// 让物体沿世界方向向上移动,每秒一个单位长度
transform.Translate(0, Time.deltaTime, 0, Space.World);
}
}
除了 Space.Self
和 Spcae.World
还可以使用例如 Camera.main.transform
来实现相对座标系的移动。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
private void Update()
{
// 让物体向相机右侧移动,每秒一个单位长度
transform.Translate(Time.deltaTime, 0, 0, Camera.main.Transform);
}
}
Transform.LookAt
面向某一物体或坐标(旋转变换,使向前矢量指向 target
或者 worldPosition
)
定义
public void LookAt(Transform target, Vector3 worldUp = Vector3.up);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
target | Transform | 是 | 指向的对象 |
worldUp | Vector3 | 否 | 指定向上方向的向量,默认世界 Y 轴 |
public void LookAt (Vector3 worldPosition, Vector3 worldUp = Vector3.up);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
worldPosition | Transform | 是 | 要对准的点 |
worldUp | Vector3 | 否 | 指定向上方向的向量,默认世界 Y 轴 |
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
public Transform target;
private void Update()
{
// 旋转相机,使其每帧都看向 target
transform.LookAt(target);
// 同上,但设置向上方向的向量为 Vector3.left,相机将会被转向侧面
transform.LookAt(target, Vector3.left);
}
}
看向某一点:
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
public Transform target;
private void Update()
{
// 看向世界座标系中的 (0, 0, 0)
transform.LookAt(Vector3.zero);
}
}
Rigidbody
方法 | 说明 |
---|---|
AddForce | 对刚体施加力 |
Rigidbody.AddForce
对刚体施加力
定义
public void AddForce (Vector3 force, ForceMode mode = ForceMode.Force);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
force | Vector3 | 是 | 世界坐标下表示力方向和大小的矢量 |
mode | ForceMode | 否 | 施加力的模式,默认 ForceMode.Force ForceMode.Force :利用刚体的质量向刚体添加一个连续的力ForceMode.Acceleration :向刚体添加一个连续的加速度,忽略它的质量ForceMode.Impulse :利用刚体的质量向刚体添加一个瞬时的力ForceMode.VelocityChange :给刚体添加一个瞬时的加速度,忽略它的质量 |
public void AddForce (float x, float y, float z, ForceMode mode = ForceMode.Force);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
x | float | 是 | 沿世界 x 轴的力大小 |
y | float | 是 | 沿世界 y 轴的力大小 |
z | float | 是 | 沿世界 z 轴的力大小 |
mode | ForceMode | 否 | 施加力的模式,默认 ForceMode.Force ForceMode.Force :利用刚体的质量向刚体添加一个连续的力ForceMode.Acceleration :向刚体添加一个连续的加速度,忽略它的质量ForceMode.Impulse :利用刚体的质量向刚体添加一个瞬时的力ForceMode.VelocityChange :给刚体添加一个瞬时的加速度,忽略它的质量 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public Rigidbody myRigidbody;
public float myThrust = 20f;
private void Start()
{
myRigidbody = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
if (Input.GetButton("Jump"))
{
// 对这个物体施加向上的力
myRigidbody.AddForce(transform.up * myThrust);
}
}
}
using UnityEngine;
public class Example : MonoBehaviour
{
public Rigidbody myRigidbody;
public float myThrust = 10f;
private void Start()
{
myRigidbody = GetComponent<Rigidbody>();
// 给物体一个沿 z 轴方向的瞬时力
myRigidbody.AddForce(0, 0, myThrust, ForceMode.Impulse);
}
}
Random
生成随机数据(点、旋转、状态、浮点数等)
方法 | 说明 |
---|---|
Range | 返回区间内一个随机数值 |
Random.Range
返回区间内一个随机数值。
int
类型时区间左闭右开,float
类型时区间左闭右闭。
定义
public static int Range(int minInclusive, int maxInclusive);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
minInclusive | int | 是 | 最小值 |
maxInclusive | int | 是 | 最大值 |
public static float Range(float minInclusive, float maxInclusive);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
minInclusive | float | 是 | 最小值 |
maxInclusive | float | 是 | 最大值 |
点击按钮后,随机在 ([-10 ~ 10], 0, [-10 ~ 10])
的位置生成物体
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public GameObject prefab;
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 50), "Instantiate!"))
{
var position = new Vector3(Random.Range(-10.0f, 10.0f), 0, Random.Range(-10.0f, 10.0f));
Instantiate(prefab, position, Quaternion.identity);
}
}
}
Object
Unity 中所有可引用对象的基类
方法 | 说明 |
---|---|
Instantiate | 克隆游戏对象 |
DontDestroyOnLoad | 加载新场景时不破坏目标对象 |
Object.Instantiate
克隆 original
对象并返回此克隆。
定义
public static Object Instantiate(
Object original,
Transform parent,
bool instantiateInWorldSpace
);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
original | Object | 是 | 要克隆的现有对象 |
parent | Transform | 否 | 新对象的父对象 |
instantiateInWorldSpace | bool | 否 | true :相对于世界空间false :相对于父对象 |
public static Object Instantiate(
Object original,
Vector3 position,
Quaternion rotation,
Transform parent
);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
original | Object | 是 | 要克隆的现有对象 |
position | Vector3 | 是 | 新对象的位置 |
rotation | Quaternion | 是 | 新对象的旋转 |
parent | Transform | 否 | 新对象的父对象 |
using UnityEngine;
public class Example : MonoBehaviour
{
public GameObject prefab;
void Start()
{
for (var i = 0; i < 10; i++)
{
Instantiate(prefab, new Vector3(i * 2.0f, 0, 0), Quaternion.identity);
}
}
}
Object.DontDestroyOnLoad
加载新场景时不破坏目标对象
定义
public static void DontDestroyOnLoad(Object target);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
target | Object | 是 | 场景改变时不摧毁的物体 |
GameObject
Unity 场景中所有实体的基类。
方法 | 说明 |
---|---|
Find | 通过名称查找 GameObject |
GetComponent | 返回 GameObject 的一个指定类型组件 |
GetComponentInChildren | 返回 Gameobject 或其子对象中的一个指定类型组件 |
AddComponent | 向 GameObject 添加组件 |
SetActive | 激活或禁用游戏对象 |
GameObject.Find
通过名称查找游戏对象(GameObject
)
定义
public static GameObject Find(string name);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 游戏对象的名称 |
GameObject.GetComponent
返回游戏对象(GameObject
)的第一个指定类型组件,如果没有则返回 null
。
定义
public Component GetComponent(Type type);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
type | Type | 是 | 要检索的组件类型 |
public Component GetComponent(string type);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
type | string | 是 | 要检索的组件类型 |
public T GetComponent<T>();
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
T | 泛型 | 是 | 要检索的组件类型 |
GameObject.GetComponentInChildren
返回游戏对象(GameObject
)及其子对象中第一个指定类型的组件,如果没有则返回 null
。
定义
public Component[] GetComponentsInChildren(Type type, bool includeInactive = false);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
type | Type | 是 | 要检索的组件类型 |
includeInactive | bool | 否 | 是否检索不活动对象,默认否 (预制体是不活动的对象) |
GameObject.AddComponent
向游戏对象(GameObject
)添加组件
定义
public Component AddComponent(string className);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
className | string | 是 | 组件类名 |
public Component AddComponent(Type componentType);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
componentType | Type | 是 | 组件类型 |
public T AddComponent<T>();
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
T | 泛型 | 是 | 组件类型 |
GameObject.SetActive
激活或禁用游戏对象(GameObject
)
定义
public void SetActive(bool value);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
value | bool | 是 | 激活(true )或禁用(false )游戏对象 |
Resources
用于查找和访问资源等对象。
方法 | 说明 |
---|---|
Load | 加载指定路径(资源文件夹中)的资产 |
Resources.Load
加载指定路径(资源文件夹中)的资产。
定义
public static T Load(string path);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
path | string | 是 | 资产路径 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
private void Start()
{
// 加载一个文本文件 (Assets/Resources/Text/textFile01.txt)
var textFile = Resources.Load<TextAsset>("Text/textFile01");
// 加载一个 JSON 文件 (Assets/Resources/Text/jsonFile01.json)
var jsonTextFile = Resources.Load<TextAsset>("Text/jsonFile01");
// 然后使用 JsonUtility.FromJson<T>() 来反序列化 JSON 文本文件
// 加载一个材质 (Assets/Resources/Textures/texture01.png)
var texture = Resources.Load<Texture2D>("Textures/texture01");
// 加载一个精灵对象 (Assets/Resources/Sprites/sprite01.png)
var sprite = Resources.Load<Sprite>("Sprites/sprite01");
// 加载一段音频 (Assets/Resources/Audio/audioClip01.mp3)
var audioClip = Resources.Load<AudioClip>("Audio/audioClip01");
}
}
补充
- 用
Resources
加载的资源,只能位于Assets/Resources/
文件夹下。 - 传入路径用
/
表示子文件夹 Resources
加载资源的相关代码最好在打开场景时进行加载。Resources
加载资源的方式时只读的,在游戏打包后就无法对文件内容进行修改。- 游戏打包导出时,
Resources
目录下的文件,不论是否在游戏中使用,都会被打包到游戏中增加体积,因此应该尽量控制Resources
目录下的文件数量
Collider
碰撞体,用于物体间产生阻碍或检测碰撞。
碰撞型检测
碰撞时两物体产生阻碍
方法 | 说明 |
---|---|
OnCollisionEnter | 碰撞时被调用 |
OnCollisionExit | 碰撞体离开时被调用 |
OnCollisionStay | 碰撞体持续碰撞时被调用 |
触发型检测
碰撞时两物体不产生阻碍
方法 | 说明 |
---|---|
OnTriggerEnter | 触发器进入时被调用 |
OnTriggerExit | 触发器退出时被调用 |
OnTriggerStay | 在触发器内时被调用 |
补充
OnCollisionxxx 使用注意:
- 碰撞双方都有碰撞体或者刚体
- 如果双方都有刚体,需要勾选
isKinematic
- 双方都不可勾选
isTrigger
OnTriggerxxx 使用前提:
- 碰撞双方都有碰撞体
- 至少有一方有刚体
- 至少有一方勾选
isTrigger
Collider.OnCollisionEnter
当物体刚碰撞另一个物体时被调用。
定义
private void OnCollisionEnter(Collision collision);
参数名 | 类型 | 说明 |
---|---|---|
collision | Collision | 与该碰撞事件关联的 Collision 数据,有关 Collision 介绍见 附录 #Collision |
示例
OnCollisionStay
当物体持续碰撞另一个物体时被调用。
定义
private void OnCollisionStay(Collision collision);
参数名 | 类型 | 说明 |
---|---|---|
collision | Collision | 与该碰撞事件关联的 Collision 数据,有关 Collision 介绍见 附录 #Collision |
示例
Collider.OnCollisionExit
当物体脱离碰撞另一个物体时被调用。
定义
private void OnCollisionExit(Collision collision);
参数名 | 类型 | 说明 |
---|---|---|
collision | Collision | 与该碰撞事件关联的 Collision 数据,有关 Collision 介绍见 附录 #Collision |
示例
OnTriggerEnter
当物体刚碰撞另一个物体时被调用。
定义
private void OnTriggerEnter(Collider other)
参数名 | 类型 | 说明 |
---|---|---|
other | Collider | 该碰撞中涉及的其他碰撞体(Collider ) |
演示了 OnTriggerEnter、OnTriggerStay、OnTriggerExit 的基本用法。
碰到红色(Red
标签)扣血,碰到绿色(Green
标签)回复,在紫色(Purple
标签)里中毒,在黄色(Yellow
标签)里减速。
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float health = 10f;
public float speed = 2f;
private float _totalTime;
private void OnTriggerEnter(Collider other)
{
switch (other.tag)
{
case "Red":
health -= 2f;
break;
case "Green":
health += 1f;
break;
}
}
private void OnTriggerStay(Collider other)
{
if (other.CompareTag("Purple"))
{
_totalTime += Time.deltaTime;
if (_totalTime >= 1f)
{
health -= 0.5f;
_totalTime = 0f;
}
}
else if (other.CompareTag("Yellow"))
{
speed = 1f;
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Yellow"))
{
speed = 2f;
}
}
}
OnTriggerStay
当物体持续碰撞另一个物体时被调用。
定义
private void OnTriggerEnter(Collider other)
参数名 | 类型 | 说明 |
---|---|---|
other | Collider | 该碰撞中涉及的其他碰撞体(Collider ) |
演示了 OnTriggerEnter、OnTriggerStay、OnTriggerExit 的基本用法。
碰到红色(Red
标签)扣血,碰到绿色(Green
标签)回复,在紫色(Purple
标签)里中毒,在黄色(Yellow
标签)里减速。
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float health = 10f;
public float speed = 2f;
private float _totalTime;
private void OnTriggerEnter(Collider other)
{
switch (other.tag)
{
case "Red":
health -= 2f;
break;
case "Green":
health += 1f;
break;
}
}
private void OnTriggerStay(Collider other)
{
if (other.CompareTag("Purple"))
{
_totalTime += Time.deltaTime;
if (_totalTime >= 1f)
{
health -= 0.5f;
_totalTime = 0f;
}
}
else if (other.CompareTag("Yellow"))
{
speed = 1f;
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Yellow"))
{
speed = 2f;
}
}
}
OnTriggerExit
当物体脱离碰撞另一个物体时被调用。
定义
private void OnTriggerEnter(Collider other)
参数名 | 类型 | 说明 |
---|---|---|
other | Collider | 该碰撞中涉及的其他碰撞体(Collider ) |
演示了 OnTriggerEnter、OnTriggerStay、OnTriggerExit 的基本用法。
碰到红色(Red
标签)扣血,碰到绿色(Green
标签)回复,在紫色(Purple
标签)里中毒,在黄色(Yellow
标签)里减速。
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float health = 10f;
public float speed = 2f;
private float _totalTime;
private void OnTriggerEnter(Collider other)
{
switch (other.tag)
{
case "Red":
health -= 2f;
break;
case "Green":
health += 1f;
break;
}
}
private void OnTriggerStay(Collider other)
{
if (other.CompareTag("Purple"))
{
_totalTime += Time.deltaTime;
if (_totalTime >= 1f)
{
health -= 0.5f;
_totalTime = 0f;
}
}
else if (other.CompareTag("Yellow"))
{
speed = 1f;
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Yellow"))
{
speed = 2f;
}
}
}
附录
Collision
用于描述碰撞信息,会传递到 Collider.OnCollisionEnter、Collider.OnCollisionStay 和 Collider.OnCollisionExit 事件。
Physics
方法 | 说明 |
---|---|
CheckSphere | 检测是否有任何碰撞体重叠在定义的球体上 |
Raycast | 检测是否有任何碰撞体重叠在定义的射线上 |
Physics.CheckSphere
检测是否有任何碰撞体重叠在定义的球体上
定义
public static bool CheckSphere(
Vector3 position,
float radius,
int layerMask = DefaultRaycastLayers,
QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
position | Vector3 | 是 | 球体中心坐标 |
radius | float | 是 | 球体半径 |
layerMask | int | 否 | 层级蒙版,设定后只检测此层级中的物体是否相交 |
queryTriggerInteraction | QueryTriggerInteraction | 否 | 指定该查询是否触发触发器,默认 QueryTriggerInteraction.UseGlobal QueryTriggerInteraction.UseGlobal :使用 Physics.queriesHitTriggers 设置QueryTriggerInteraction.Ignore :忽略QueryTriggerInteraction.Colide :触发 |
using UnityEngine;
[RequireComponent(typeof(AudioSource))]
public class ExampleScript : MonoBehaviour
{
private AudioSource _audioSource;
private void Start()
{
_audioSource = GetComponent<AudioSource>();
}
private void Update()
{
if (Physics.CheckSphere(transform.position, 3.0f))
{
_audioSource.Play();
}
}
}
Physics.Raycast
检测是否有任何碰撞体重叠在定义的射线上
定义
public static bool Raycast(
Vector3 origin,
Vector3 direction,
float maxDistance = Mathf.Infinity,
int layerMask = DefaultRaycastLayers,
QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
origin | Vector3 | 是 | 世界坐标系中射线起始点 |
direction | Vector3 | 是 | 射线方向 |
maxDistance | float | 否 | 射线最大距离,默认 Mathf.Infinity ,即无限 |
layerMask | int | 否 | 层级蒙版,设定后只检测此层级中的物体是否相交 |
queryTriggerInteraction | QueryTriggerInteraction | 否 | 指定该查询是否触发触发器,默认 QueryTriggerInteraction.UseGlobal QueryTriggerInteraction.UseGlobal :使用 Physics.queriesHitTriggers 设置QueryTriggerInteraction.Ignore :忽略QueryTriggerInteraction.Colide :触发 |
NavMeshAgent
导航网格代理。
将此组件附加在游戏中的某个移动角色,以允许其使用导航网格在场景中寻路。
方法 | 说明 |
---|---|
SetDestination | 设置或更新目的地 |
ResetPath | 清楚当前路径 |
NavMeshAgent.SetDestination
设置或更新目的地
定义
public bool SetDestination (Vector3 target);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
target | Vector3 | 是 | 目的地坐标 |
using UnityEngine;
using UnityEngine.AI;
public class ExampleScript : MonoBehaviour
{
public NavMeshAgent myNavMeshAgent;
public Camera myCamera;
private void Start()
{
myNavMeshAgent = GetComponent<NavMeshAgent>();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
SetDestinationToMousePosition();
}
}
private void SetDestinationToMousePosition()
{
var ray = myCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out var hit))
{
myNavMeshAgent.SetDestination(hit.point);
}
}
}
NavMeshAgent.ResetPath
清除当前路径。
路径被清除后,代理在 SetDestination 被调用之前不会开始寻找新的路径。
定义
public void ResetPath ();
SceneManager
运行时的场景管理。
方法 | 说明 |
---|---|
LoadScene | 按照 Build Settings 中的名称或索引加载场景。 |
SceneManager.LoadScene
按照 Build Settings 中的名称或索引加载场景。
定义
public static void LoadScene (int sceneBuildIndex, SceneManagement.LoadSceneMode mode= LoadSceneMode.Single);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
sceneBuildIndex | int | 是 | 场景的索引(在 Build Settings ) |
mode | LoadSceneMode | 否 | 加载场景的方式,默认为单模式 单模式(销毁当前场景): LoadSceneMode.Single 附加模式(不销毁当前场景): LoadSceneMode.Additive |
public static void LoadScene (string sceneName, SceneManagement.LoadSceneMode mode= LoadSceneMode.Single);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
sceneName | string | 是 | 场景的名称或路径 |
mode | LoadSceneMode | 否 | 加载场景的方式,默认为单模式 单模式(销毁当前场景): LoadSceneMode.Single 附加模式(不销毁当前场景): LoadSceneMode.Additive |
public static SceneManagement.Scene LoadScene (int sceneBuildIndex, SceneManagement.LoadSceneParameters parameters);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
sceneBuildIndex | int | 是 | 场景的索引(在 Build Settings ) |
parameters | LoadSceneParameters | 是 | 用于加载场景的各种参数 |
public static SceneManagement.Scene LoadScene (string sceneName, SceneManagement.LoadSceneParameters parameters);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
sceneBuildIndex | int | 是 | 场景的名称或路径 |
parameters | LoadSceneParameters | 是 | 用于加载场景的各种参数 |
示例
Animator
用于控制 Mecanim 动画系统的接口。
方法 | 说明 |
---|---|
SetFloat | 设置浮点参数 |
SetBool | 设置布尔参数 |
SetIntger | 设置整形参数 |
SetTrigger | 设置触发器参数 |
GetCurrentAnimatorStateInfo | 返回动画当前的状态信息 |
Animator.SetFloat
设置浮点参数。
定义
public void SetFloat(string name, float value, float dampTime, float deltaTime);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 参数名称 |
value | float | 是 | 新的参数值 |
dampTime | float | 否 | 阻尼器总时间 |
deltaTime | float | 否 | 基于阻尼器的增量时间 |
public void SetFloat(int id, float value, float dampTime, float deltaTime);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
id | int | 是 | 参数 ID |
value | float | 是 | 新的参数值 |
dampTime | float | 否 | 阻尼器总时间 |
deltaTime | float | 否 | 基于阻尼器的增量时间 |
Animator.SetBool
设置布尔参数。
定义
public void SetBool(string name, bool value);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 参数名称 |
value | bool | 是 | 新的参数值 |
public void SetBool(int id, bool value);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
id | int | 是 | 参数 ID |
value | bool | 是 | 新的参数值 |
Animator.SetInteger
设置整型参数。
定义
public void SetInteger(string name, int value);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 参数名称 |
value | int | 是 | 新的参数值 |
public void SetInteger(int id, int value);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
id | int | 是 | 参数 ID |
value | int | 是 | 新的参数值 |
Animator.SetTrigger
设置触发器参数。
定义
public void SetTrigger(string name);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
name | string | 是 | 参数名称 |
public void SetTrigger(int id);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
id | int | 是 | 参数 ID |
Animator.GetCurrentAnimatorStateInfo
返回动画当前的状态信息,包括状态的速度、长度、名称和其他变量。
有关 AnimatorStateInfo
,可参阅 AnimatorStateInfo。
定义
public AnimatorStateInfo GetCurrentAnimatorStateInfo (int layerIndex);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
layerIndex | int | 时 | 层索引 |
示例
Animation
动画组件,用于播放动画
方法 | 说明 |
---|---|
Play | 播放未混合的动画 |
Stop | 停止所有动画 |
Animation.Play
播放未混合的动画
定义
public bool Play (string animation, PlayMode mode= PlayMode.StopSameLayer);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
animation | string | 否 | 动画名称,不指定则播放默认动画 |
mode | PlayMode | 否 | 播放模式,默认为 StopSameLayer StopSameLayer :播放前停止在相同层启动的所有动画StopAll :播放前停止使用此组件启动的所有动画 |
Animation.Stop
停止所有动画
定义
public void Stop();
AnimatorStateInfo
AudioSource
音频源的 3D 表示
方法 | 说明 |
---|---|
Play | 播放音频剪辑(AudioClip ) |
Stop | 停止播放音频剪辑(AudioClip ) |
Pause | 暂停播放音频剪辑(AudioClip ) |
PlayClipAtPoint | 在世界空间中指定位置播放音频剪辑(AudioClip ) |
AudioSource.Play
播放音频剪辑(AudioClip
)
定义
public void Play (ulong delay= 0);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
delay | ulong | 否 | 已弃用。以样本数为单位的延时,假设采样率为 44100Hz(意味着 Play(44100) 将使播放延时整整 1 秒) |
AudioSource.Stop
停止播放音频剪辑(AudioClip
),下次将从头开始播放。
定义
public void Stop ();
AudioSource.Pause
暂停播放音频剪辑(AudioClip
)
定义
public void Pause ();
AudioSource.PlayClipAtPoint
在世界空间中指定位置播放音频剪辑(AudioClip
)
定义
public static void PlayClipAtPoint (AudioClip clip, Vector3 position, float volume= 1.0F);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
clip | AudioClip | 是 | 要播放的音频剪辑 |
position | Vector3 | 是 | 世界空间中发出声音的位置 |
volume | float | 否 | 音量,默认 1.0 |
Debug
包含帮助调试游戏的各种方法
方法 | 说明 |
---|---|
Log | 将普通消息记录到控制台(白色) |
LogWarning | 将警告消息记录到控制台(黄色) |
LogError | 将错误消息记录到控制台(红色) |
DrawLine | 绘制一条直线 |
Debug.Log
将普通消息记录到控制台(白色)
定义
public static void Log (object message, Object context);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
message | object | 是 | 字符串或对象,将被转换为字符串表示进行显示 |
context | Object | 否 | 此消息应用到的对象 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
private void Start()
{
// 输出游戏对象的名字,将会以灰色文本显示
Debug.Log(gameObject.name);
// 将会转换为字符串表示进行显示
Debug.Log(gameObject);
// 支持富文本.
Debug.Log("<color=red>Alert: </color>Test rich text");
}
}
Debug.LogWarning
将警告消息记录到控制台(黄色)
定义
public static void LogWarning (object message, Object context);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
message | object | 是 | 字符串或对象,将被转换为字符串表示进行显示 |
context | Object | 否 | 此消息应用到的对象 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public float gravity;
private void Start()
{
if (gravity < 0)
{
// 将会以黄色文本显示
Debug.LogWarning("重力大小为负数");
}
}
}
Debug.LogError
将错误消息记录到控制台(红色)
定义
public static void LogError (object message, Object context);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
message | object | 是 | 字符串或对象,将被转换为字符串表示进行显示 |
context | Object | 否 | 此消息应用到的对象 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
public Rigidbody myRigidbody;
private void Start()
{
if (myRigidbody == null)
{
// 将会以红色文本显示
Debug.LogError("未找到 Rigidbody");
}
}
}
Debug.DrawLine
绘制一条直线
定义
public static void DrawLine (Vector3 start, Vector3 end, Color color= Color.white, float duration= 0.0f, bool depthTest= true);
参数名 | 类型 | 必要 | 说明 |
---|---|---|---|
start | Vector3 | 是 | 直线起始点(世界空间中) |
end | Vector3 | 是 | 直线结束点(世界空间中) |
color | Color | 否 | 直线颜色,默认黄色 |
duration | float | 否 | 直线的可见时间,单位秒,默认 0 ,即一帧 |
depthTest | bool | 否 | 直线是否会被遮挡,默认是 |
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
private void Start()
{
// 从原点绘制一条 5 单位长度的白线,持续 2.5 秒
Debug.DrawLine(Vector3.zero, new Vector3(5, 0, 0), Color.white, 2.5f);
}
private float q = 0.0f;
private void FixedUpdate()
{
// 从原点画一条 5 单位长度的彩色线,一直显示
Color color = new Color(q, q, 1.0f);
Debug.DrawLine(Vector3.zero, new Vector3(0, 5, 0), color);
q = q + 0.01f;
if (q > 1.0f)
{
q = 0.0f;
}
}
}