介绍

此文档来自 简问 游戏开发频道

平台帐号
bilibili
QQ 群
抖音
知乎
小红书
知识星球
西瓜视频

文档仓库:swgzhjianwen/unity-docs

Vector3

表示三维向量和点的数据类型,用于传递 3D 位置和方向。

方法说明
Distance计算两点间距离
Angle计算两向量间角度
Normalize对向量进行标准化(归一化)

Vector3.Distance

计算两点间距离。

定义

public static float Distance(Vector3 a, Vector3 b);
参数名类型必要说明
aVector3a 点
bVector3b 点

示例

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);
参数名类型必要说明
fromVector3源向量
toVector3目标向量

示例

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);
参数名类型必要说明
valueVector3待归一化向量

示例

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);
参数名类型必要说明
xfloatX 轴旋转度数
yfloatY 轴旋转度数
zfloatZ 轴旋转度数
public static Quaternion Euler (Vector euler);
参数名类型必要说明
eulerVector3表示 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);
参数名类型必要说明
buttonint按键对应数字
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);
参数名类型必要说明
buttonint按键对应数字
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);
参数名类型必要说明
buttonint按键对应数字
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);
参数名类型必要说明
buttonNamestring按键对应字符串,如 "Jump""Mouse X",只能为在 InputManager 中定义的轴键,可在 Unity 窗口 Editor > Project Settings > Input Manager 中找到。

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);
参数名类型必要说明
buttonNamestring按键对应字符串,如 "Jump""Mouse X",只能为在 InputManager 中定义的轴键,可在 Unity 窗口 Editor > Project Settings > Input Manager 中找到。

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);
参数名类型必要说明
buttonNamestring按键对应字符串,如 "Jump""Mouse X",只能为在 InputManager 中定义的轴键,可在 Unity 窗口 Editor > Project Settings > Input Manager 中找到。

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);
参数名类型必要说明
namestring按键对应代码,详见 附录 #按键名称表
public static bool GetKey(KeyCode key);
参数名类型必要说明
keyKeyCode按键对应字符串名称,详见 附录 #按键代码表

示例

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);
参数名类型必要说明
namestring按键对应代码,详见 附录 #按键名称表
public static bool GetKeyDown(KeyCode key);
参数名类型必要说明
keyKeyCode按键对应字符串名称,详见 附录 #按键代码表

示例

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);
参数名类型必要说明
namestring按键对应代码,详见 附录 #按键名称表
public static bool GetKeyUp(KeyCode key);
参数名类型必要说明
keyKeyCode按键对应字符串名称,详见 附录 #按键代码表

示例

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";
    }
}

应用场景

  1. 使用每帧时间累加,来进行游戏计数。

  2. 让运动的物体,在相同的时间内保持平均的速度进行运动(引入增量时间;将数值乘以 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);
参数名类型必要说明
speedVector3各方向移动速度,单位为 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);
参数名类型必要说明
motionVector3各方向移动的绝对增量值

示例

一个简单的第一人称控制器

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 只有角色移动时(调用 SimpleMoveMove时)才会进行检测,并且 CharacterControllerSkin 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);
参数名类型必要说明
eulersVector3表示旋转的欧拉角
relativeToSpace相对的坐标系,默认 Space.Self
Space.Self:局部坐标系
Space.World:世界坐标系
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
参数名类型必要说明
xAnglefloatX 轴旋转角度
yAnglefloatY 轴旋转角度
zAnglefloatZ 轴旋转角度
relativeToSpace相对的坐标系,默认 Space.Self
Space.Self:局部坐标系
Space.World:世界坐标系
public void Rotate(Vector3 axis, float angle, Space relativeTo = Space.Self);
参数名类型必要说明
axisVector3旋转所绕轴
anglefloat旋转角度
relativeToSpace相对的坐标系,默认 Space.Self
Space.Self:局部坐标系
Space.World:世界坐标系

示例

该示例代码创建了两个不同的立方体:红色立方体按照局部座标系 Space.Self 旋转;绿色立方体按照世界座标系 Space.World 旋转。

通过改变面板中的 xAngleyAnglezAngle 控制旋转角度。

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);
参数名类型必要说明
translationVector3移动方向和大小
relativeToSpace相对的坐标系,默认 Space.Self
Space.Self:局部坐标系
Space.World:世界坐标系
public void Translate(float x, float y, float z, Space relativeTo = Space.Self);
参数名类型必要说明
xfloatX 轴移动大小
yfloatY 轴移动大小
zfloatZ 轴移动大小
relativeToSpace相对的坐标系,默认 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.SelfSpcae.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);
参数名类型必要说明
targetTransform指向的对象
worldUpVector3指定向上方向的向量,默认世界 Y 轴
public void LookAt (Vector3 worldPosition, Vector3 worldUp = Vector3.up);
参数名类型必要说明
worldPositionTransform要对准的点
worldUpVector3指定向上方向的向量,默认世界 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);
参数名类型必要说明
forceVector3世界坐标下表示力方向和大小的矢量
modeForceMode施加力的模式,默认 ForceMode.Force
ForceMode.Force:利用刚体的质量向刚体添加一个连续的力
ForceMode.Acceleration:向刚体添加一个连续的加速度,忽略它的质量
ForceMode.Impulse:利用刚体的质量向刚体添加一个瞬时的力
ForceMode.VelocityChange:给刚体添加一个瞬时的加速度,忽略它的质量
public void AddForce (float x, float y, float z, ForceMode mode = ForceMode.Force);
参数名类型必要说明
xfloat沿世界 x 轴的力大小
yfloat沿世界 y 轴的力大小
zfloat沿世界 z 轴的力大小
modeForceMode施加力的模式,默认 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);
        }
    }
}

示例:指定 x、y、z 各轴的大小

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);
参数名类型必要说明
minInclusiveint最小值
maxInclusiveint最大值
public static float Range(float minInclusive, float maxInclusive);
参数名类型必要说明
minInclusivefloat最小值
maxInclusivefloat最大值

示例

点击按钮后,随机在 ([-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
);
参数名类型必要说明
originalObject要克隆的现有对象
parentTransform新对象的父对象
instantiateInWorldSpacebooltrue:相对于世界空间
false:相对于父对象
public static Object Instantiate(
    Object original,
    Vector3 position,
    Quaternion rotation,
    Transform parent
);
参数名类型必要说明
originalObject要克隆的现有对象
positionVector3新对象的位置
rotationQuaternion新对象的旋转
parentTransform新对象的父对象

示例

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);
参数名类型必要说明
targetObject场景改变时不摧毁的物体

GameObject

Unity 场景中所有实体的基类。

方法说明
Find通过名称查找 GameObject
GetComponent返回 GameObject 的一个指定类型组件
GetComponentInChildren返回 Gameobject 或其子对象中的一个指定类型组件
AddComponentGameObject 添加组件
SetActive激活或禁用游戏对象

GameObject.Find

通过名称查找游戏对象(GameObject

定义

public static GameObject Find(string name);
参数名类型必要说明
namestring游戏对象的名称

GameObject.GetComponent

返回游戏对象(GameObject)的第一个指定类型组件,如果没有则返回 null

定义

public Component GetComponent(Type type);
参数名类型必要说明
typeType要检索的组件类型
public Component GetComponent(string type);
参数名类型必要说明
typestring要检索的组件类型
public T GetComponent<T>();
参数名类型必要说明
T泛型要检索的组件类型

GameObject.GetComponentInChildren

返回游戏对象(GameObject)及其子对象中第一个指定类型的组件,如果没有则返回 null

定义

public Component[] GetComponentsInChildren(Type type, bool includeInactive = false);
参数名类型必要说明
typeType要检索的组件类型
includeInactivebool是否检索不活动对象,默认否
(预制体是不活动的对象)

GameObject.AddComponent

向游戏对象(GameObject)添加组件

定义

public Component AddComponent(string className);
参数名类型必要说明
classNamestring组件类名
public Component AddComponent(Type componentType);
参数名类型必要说明
componentTypeType组件类型
public T AddComponent<T>();
参数名类型必要说明
T泛型组件类型

GameObject.SetActive

激活或禁用游戏对象(GameObject

定义

public void SetActive(bool value);
参数名类型必要说明
valuebool激活(true)或禁用(false)游戏对象

Resources

用于查找和访问资源等对象。

方法说明
Load加载指定路径(资源文件夹中)的资产

Resources.Load

加载指定路径(资源文件夹中)的资产。

定义

public static T Load(string path);
参数名类型必要说明
pathstring资产路径

示例

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");
    }
}

补充

注意事项

  1. Resources 加载的资源,只能位于 Assets/Resources/ 文件夹下。
  2. 传入路径用 / 表示子文件夹
  3. Resources 加载资源的相关代码最好在打开场景时进行加载。
  4. Resources 加载资源的方式时只读的,在游戏打包后就无法对文件内容进行修改。
  5. 游戏打包导出时,Resources 目录下的文件,不论是否在游戏中使用,都会被打包到游戏中增加体积,因此应该尽量控制 Resources 目录下的文件数量

Collider

碰撞体,用于物体间产生阻碍或检测碰撞。

碰撞型检测

碰撞时两物体产生阻碍

方法说明
OnCollisionEnter碰撞时被调用
OnCollisionExit碰撞体离开时被调用
OnCollisionStay碰撞体持续碰撞时被调用

触发型检测

碰撞时两物体不产生阻碍

方法说明
OnTriggerEnter触发器进入时被调用
OnTriggerExit触发器退出时被调用
OnTriggerStay在触发器内时被调用

补充

OnCollisionxxx 使用注意:

  • 碰撞双方都有碰撞体或者刚体
  • 如果双方都有刚体,需要勾选 isKinematic
  • 双方都不可勾选 isTrigger

OnTriggerxxx 使用前提:

  • 碰撞双方都有碰撞体
  • 至少有一方有刚体
  • 至少有一方勾选 isTrigger

Collider.OnCollisionEnter

当物体刚碰撞另一个物体时被调用。

定义

private void OnCollisionEnter(Collision collision);
参数名类型说明
collisionCollision与该碰撞事件关联的 Collision 数据,有关 Collision 介绍见 附录 #Collision

示例

OnCollisionStay

当物体持续碰撞另一个物体时被调用。

定义

private void OnCollisionStay(Collision collision);
参数名类型说明
collisionCollision与该碰撞事件关联的 Collision 数据,有关 Collision 介绍见 附录 #Collision

示例

Collider.OnCollisionExit

当物体脱离碰撞另一个物体时被调用。

定义

private void OnCollisionExit(Collision collision);
参数名类型说明
collisionCollision与该碰撞事件关联的 Collision 数据,有关 Collision 介绍见 附录 #Collision

示例

OnTriggerEnter

当物体刚碰撞另一个物体时被调用。

定义

private void OnTriggerEnter(Collider other)
参数名类型说明
otherCollider该碰撞中涉及的其他碰撞体(Collider

示例

演示了 OnTriggerEnterOnTriggerStayOnTriggerExit 的基本用法。

碰到红色(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)
参数名类型说明
otherCollider该碰撞中涉及的其他碰撞体(Collider

示例

演示了 OnTriggerEnterOnTriggerStayOnTriggerExit 的基本用法。

碰到红色(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)
参数名类型说明
otherCollider该碰撞中涉及的其他碰撞体(Collider

示例

演示了 OnTriggerEnterOnTriggerStayOnTriggerExit 的基本用法。

碰到红色(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.OnCollisionEnterCollider.OnCollisionStayCollider.OnCollisionExit 事件。

Physics

方法说明
CheckSphere检测是否有任何碰撞体重叠在定义的球体
Raycast检测是否有任何碰撞体重叠在定义的射线

Physics.CheckSphere

检测是否有任何碰撞体重叠在定义的球体

定义

public static bool CheckSphere(
    Vector3 position,
    float radius,
    int layerMask = DefaultRaycastLayers,
    QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
);
参数名类型必要说明
positionVector3球体中心坐标
radiusfloat球体半径
layerMaskint层级蒙版,设定后只检测此层级中的物体是否相交
queryTriggerInteractionQueryTriggerInteraction指定该查询是否触发触发器,默认 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
);
参数名类型必要说明
originVector3世界坐标系中射线起始点
directionVector3射线方向
maxDistancefloat射线最大距离,默认 Mathf.Infinity,即无限
layerMaskint层级蒙版,设定后只检测此层级中的物体是否相交
queryTriggerInteractionQueryTriggerInteraction指定该查询是否触发触发器,默认 QueryTriggerInteraction.UseGlobal
QueryTriggerInteraction.UseGlobal:使用 Physics.queriesHitTriggers 设置
QueryTriggerInteraction.Ignore:忽略
QueryTriggerInteraction.Colide:触发

NavMeshAgent

导航网格代理。

将此组件附加在游戏中的某个移动角色,以允许其使用导航网格在场景中寻路。

方法说明
SetDestination设置或更新目的地
ResetPath清楚当前路径

NavMeshAgent.SetDestination

设置或更新目的地

定义

public bool SetDestination (Vector3 target);
参数名类型必要说明
targetVector3目的地坐标

示例

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);
参数名类型必要说明
sceneBuildIndexint场景的索引(在 Build Settings
modeLoadSceneMode加载场景的方式,默认为单模式
单模式(销毁当前场景):LoadSceneMode.Single
附加模式(不销毁当前场景):LoadSceneMode.Additive
public static void LoadScene (string sceneName, SceneManagement.LoadSceneMode mode= LoadSceneMode.Single);
参数名类型必要说明
sceneNamestring场景的名称或路径
modeLoadSceneMode加载场景的方式,默认为单模式
单模式(销毁当前场景):LoadSceneMode.Single
附加模式(不销毁当前场景):LoadSceneMode.Additive
public static SceneManagement.Scene LoadScene (int sceneBuildIndex, SceneManagement.LoadSceneParameters parameters);
参数名类型必要说明
sceneBuildIndexint场景的索引(在 Build Settings
parametersLoadSceneParameters用于加载场景的各种参数
public static SceneManagement.Scene LoadScene (string sceneName, SceneManagement.LoadSceneParameters parameters);
参数名类型必要说明
sceneBuildIndexint场景的名称或路径
parametersLoadSceneParameters用于加载场景的各种参数

示例

Animator

用于控制 Mecanim 动画系统的接口。

方法说明
SetFloat设置浮点参数
SetBool设置布尔参数
SetIntger设置整形参数
SetTrigger设置触发器参数
GetCurrentAnimatorStateInfo返回动画当前的状态信息

Animator.SetFloat

设置浮点参数。

定义

public void SetFloat(string name, float value, float dampTime, float deltaTime);
参数名类型必要说明
namestring参数名称
valuefloat新的参数值
dampTimefloat阻尼器总时间
deltaTimefloat基于阻尼器的增量时间
public void SetFloat(int id, float value, float dampTime, float deltaTime);
参数名类型必要说明
idint参数 ID
valuefloat新的参数值
dampTimefloat阻尼器总时间
deltaTimefloat基于阻尼器的增量时间

Animator.SetBool

设置布尔参数。

定义

public void SetBool(string name, bool value);
参数名类型必要说明
namestring参数名称
valuebool新的参数值
public void SetBool(int id, bool value);
参数名类型必要说明
idint参数 ID
valuebool新的参数值

Animator.SetInteger

设置整型参数。

定义

public void SetInteger(string name, int value);
参数名类型必要说明
namestring参数名称
valueint新的参数值
public void SetInteger(int id, int value);
参数名类型必要说明
idint参数 ID
valueint新的参数值

Animator.SetTrigger

设置触发器参数。

定义

public void SetTrigger(string name);
参数名类型必要说明
namestring参数名称
public void SetTrigger(int id);
参数名类型必要说明
idint参数 ID

Animator.GetCurrentAnimatorStateInfo

返回动画当前的状态信息,包括状态的速度、长度、名称和其他变量。

有关 AnimatorStateInfo,可参阅 AnimatorStateInfo

定义

public AnimatorStateInfo GetCurrentAnimatorStateInfo (int layerIndex);
参数名类型必要说明
layerIndexint层索引

示例

Animation

动画组件,用于播放动画

方法说明
Play播放未混合的动画
Stop停止所有动画

Animation.Play

播放未混合的动画

定义

public bool Play (string animation, PlayMode mode= PlayMode.StopSameLayer);
参数名类型必要说明
animationstring动画名称,不指定则播放默认动画
modePlayMode播放模式,默认为 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);
参数名类型必要说明
delayulong已弃用。以样本数为单位的延时,假设采样率为 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);
参数名类型必要说明
clipAudioClip要播放的音频剪辑
positionVector3世界空间中发出声音的位置
volumefloat音量,默认 1.0

Debug

包含帮助调试游戏的各种方法

方法说明
Log将普通消息记录到控制台(白色)
LogWarning将警告消息记录到控制台(黄色)
LogError将错误消息记录到控制台(红色)
DrawLine绘制一条直线

Debug.Log

将普通消息记录到控制台(白色)

定义

public static void Log (object message, Object context);
参数名类型必要说明
messageobject字符串或对象,将被转换为字符串表示进行显示
contextObject此消息应用到的对象

示例

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);
参数名类型必要说明
messageobject字符串或对象,将被转换为字符串表示进行显示
contextObject此消息应用到的对象

示例

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); 
参数名类型必要说明
messageobject字符串或对象,将被转换为字符串表示进行显示
contextObject此消息应用到的对象

示例

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);
参数名类型必要说明
startVector3直线起始点(世界空间中)
endVector3直线结束点(世界空间中)
colorColor直线颜色,默认黄色
durationfloat直线的可见时间,单位秒,默认 0,即一帧
depthTestbool直线是否会被遮挡,默认是

示例

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;
        }
    }
}

推荐阅读

Unity 官方 API 文档(中)

Unity 官方 API 文档(英)

Unity 官方手册(中)

Unity 官方手册(英)