Unity基础学习笔记(B站视频课整理)

一、坐标系相关

  1. Unity 坐标系:Unity 采用左手坐标系,世界坐标以场景原点 (0,0,0) 为中心,X 轴向右、Y 轴向上、Z 轴向屏幕内为正方向;物体自身还有局部坐标系(自身坐标),移动、旋转、缩放默认基于自身轴,也可切换为世界轴。UI 与 2D 常用屏幕坐标系,以左下角为原点,右上角为屏幕宽高,还会用到视口坐标与像素坐标,各类坐标可通过 Camera.main.WorldToScreenPoint 等方法相互转换,场景中位置、向量、移动都严格遵循这套坐标规则。
  2. 轴的对应关系:Z轴 forward(向前)、X轴 right(向右)、Y轴 up(向上)。

二、场景与视图操作

  1. Scenes场景和Game的概念:场景是我们的设置画面,Game是玩家实际看到的游戏场景,play状态下的更改不会被保存。

  2. 如何创建物体以及拖动物体,如何沿着固定轴移动:Create -> 3D Object,点击箭头不放拖动可沿着某个固定轴拖动,点击面不放拖动可沿着某个面拖动。

  3. Perspective和Isometric:Perspective为透视图,Isometric为正交视图,一般用于对齐。

  4. 快速从不同方向观察物体:点击右上角世界坐标轴的中点,右键进行切换。

  5. 打开天空背景和栅格(调节栅格透明度):一个小栅格对应现实世界1m(非硬性规定)。

  6. 摄像机与视图同步:点击摄像机,再点击快捷键Align With View可以快速将摄像机拍摄画面转换为当前调节观察的画面。

  7. 摄像机属性:可更改Game场景的颜色。

  8. 如何调节透视畸变:把照相机的视场角(Field of View)调小一点。

  9. 物体的隐藏:以隐藏灯光为例,隐藏后场景明显变暗。

  10. 打开Look View Selected:可使场景跟随物体运动。

  11. 如何调出Console:通过Unity顶部Window->General->Console调出。

三、物体相关操作

  1. 贴图:将图片拖动到材质球上,再将材质球拖动到要贴图的物体上。
  2. 父子物体坐标系位置关系(相对坐标):Position和Local Position的区别;Center与Pivot的区别。
  3. 空物体的两个作用:
    (1)节点的组织和管理:两个物体没有明显的父子关系但想要作为一个整体使用,可以用空物体作为共同的父物体。
    (2)标记一个位置。
    父子关系示例------创建一个叫desk的空物体,将桌子所有的cube拖动到desk下,可通过只选中desk移动整个桌子;移动父亲,儿子会跟着移动,移动儿子,父亲不会跟着移动。
  4. 快捷键QWERTY:无额外补充说明(Q选择、W移动、E旋转、R缩放、T Rect工具、Y变换工具)。
  5. 旋转中心:旋转中心为物体的中心点,想实现门的旋转效果,有两种案例:
    案例一:创建一个空物体(命名为DoorParent),移动位置,与门Cube形成父子关系,通过旋转空物体DoorParent,实现门的旋转效果。

    案例二:给DoorParent添加如下的Door脚本文件,实现按下Z键开门,松开Z键关门。
csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Door : MonoBehaviour
{
    private Transform m_Transform;
    // Start is called before the first frame update
    void Start()
    {
        m_Transform = game<Transform> ();

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Z))
        {
            //open.
            OpenDoor();
        }
        if (Input.GetKeyUp(KeyCode.Z))
        {
            //open.
            CloseDoor();
        }
    }
    void OpenDoor()
    { 
        m_Transform.Rotate(Vector3.up, 90);
    }
    void CloseDoor()
    {
        m_Transform.Rotate(Vector3.up, -90);
    }

}

四、组件相关

  1. 组件基础:一个组件是一个功能;添加组件(如重力刚体),创建自己的C#脚本;创建空物体添加多个组件、组件的复制、粘贴组件值。

  2. Transform组件:最基本的组件,组件相当于一个类,Transform有position、rotation、scale三个属性,Reset可以快速回到原点(0,0,0),如下图;可通过调整数值改变物体位置等。

  3. Mesh Filter和Mesh Renderer:

    Mesh Filter:负责存储 / 提供 3D 物体的几何形状数据(比如立方体、球体的顶点、面、法线等),相当于 "存储模型形状的容器"。

    Mesh Renderer:负责将 Mesh Filter 提供的形状数据,结合材质 / 光照等,绘制到屏幕上,将物体显示出来,相当于 "把形状渲染出来的画笔和画布"。

  4. 光源组件:默认有一个Directional Light,Unity中还提供了Point Light(电灯泡)、Spotlight(聚光灯),也可以随意创建一个灯光,改变光源类型(修改Type属性)。

  5. 刚体组件(Rigidbody):

    添加了刚体组件,物体就有了重力;添加刚体步骤:Add Component→Rigidbody。

    刚体组件的属性:Mass(质量)、Drag(阻力,阻力设置太大物体会停止运动)、Angular Drag(角阻力,阻力设置太大物体会停止运动);当上面的物体砸到下面的物体时,把下面的物体的角阻力设置较大,下面的物体旋转会较慢。

使用刚体来移动游戏物体:此时物体在移动时,会和其他物体发生碰撞,不会直接穿透。

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    public float moveSpeed = 5f;
    private Rigidbody rb;
    private Vector3 moveDir;

    void Start()
    {
        // 获取物体上的刚体组件
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // 获取输入方向
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
        moveDir = new Vector3(h, 0, v).normalized;
    }

    void FixedUpdate()
    {
        // 刚体物理移动
        if (moveDir.magnitude >= 0.1f)
        {
            rb.velocity = moveDir * moveSpeed;
        }
        else
        {
            rb.velocity = Vector3.zero;
        }
    }
}
  1. 碰撞体组件(Collider):
    碰撞的目标物体就是"碰撞体",碰撞物体实际是碰撞该物体的Box Collider,两个物体相撞实际上是两个物体的Collider进行碰撞;加了刚体,就必须加碰撞体,否则没意义。(只加刚体不加碰撞体,物体会直接掉下去)。
    创建物体时,自带了Collider。
    四种场景直观清晰展示不同情况下的效果:
  2. 触发器:
    碰撞体勾选 Is Trigger,物体进入 / 停留 / 离开时自动触发 OnTrigger 系列方法。
    两个触发物体必须同时满足这3个条件,OnTrigger才会调用:
    ① 双方都有 Collider(碰撞体);② 其中至少一个碰撞体勾选了 Is Trigger;③ 其中至少一个物体带有 Rigidbody(刚体)(运动的物体建议加刚体)。
    三个核心方法:
方法 调用时机 执行频率
OnTriggerEnter(Collider other) 刚接触的第一帧 只调用1次
OnTriggerStay(Collider other) 持续接触中 每帧调用
OnTriggerExit(Collider other) 结束接触的第一帧 只调用1次

案例:当学生靠近门时,门自动打开,进入时自动关闭。

核心是使用触发器,创建名为DoorTrigger的物体,添加Box Collider,调整其size包裹住door,勾选IsTrigger,将其变为一个触发器;给DoorTrigger添加一个DoorTrigger脚本,获取DoorParent下的Door脚本,使用其开门关门的方法;注意要把Door脚本中的OpenDoor()和CloseDoor()方法改为public。

DoorTrigger脚本:

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoorTrigger : MonoBehaviour
{
    // 这里要和你的门脚本类型对应,是Door不是DoorTrigger
    private Door m_Door;

    void Start()
    {
        // 查找场景中名为DoorParent的物体,并获取Door组件
        m_Door = GameObject.Find("DoorParent").GetComponent<Door>();
    }

    // 当物体进入触发器时触发
    void OnTriggerEnter(Collider coll)
    {
        // 注意:字符串必须用双引号"",不是单引号''
        if (coll.gameObject.name == "Student")
        {
            m_Door.OpenDoor();
        }
    }

    // 当物体离开触发器时触发
    void OnTriggerExit(Collider coll)
    {
        if (coll.gameObject.name == "Student")
        {
            m_Door.CloseDoor();
        }
    }
}

Door脚本:

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Door : MonoBehaviour
{
    private Transform m_Transform;

    // Start is called before the first frame update
    void Start()
    {
        m_Transform = gameObject.GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Z))
        {
            // open
            OpenDoor();
        }
        if (Input.GetKeyUp(KeyCode.Z))
        {
            // open
            CloseDoor();
        }
    }

    public void OpenDoor()
    {
        m_Transform.Rotate(Vector3.up, 90);
    }

    public void CloseDoor()
    {
        m_Transform.Rotate(Vector3.up, -90);
    }
}

五、脚本相关

  1. 脚本基础:在Unity中可在Assets文件夹下新建Scripts文件夹统一存放所有.cs脚本。
  2. 脚本的生命周期:执行顺序:Awake → OnEnable → Start → Update → FixedUpdate → LateUpdate → OnDisable → OnDestroy,可设置优先级值改变优先级执行顺序。
  3. 核心方法说明:
    Update ():帧更新方法,默认每秒约执行60次,可通过Time.time获取游戏总运行时间、Time.deltaTime获取帧间隔时间。
    Awake () 与 Start ():执行顺序为所有脚本先运行Awake () 再运行Start ();Awake () 在物体激活时就会执行,即便脚本取消勾选也会调用;Start () 仅在脚本启用时才执行,常用于后续逻辑初始化。
  4. 编写代码控制物体的运动(匀速运动):定义移动速度,移动距离为 speed*Time.deltaTime。
  5. 欧拉角-物体的旋转(匀速旋转):定义转速,旋转角度为 转速*Time.deltaTime。
  6. 自转和公转(模拟地球卫星系统):在地球处设置一个空物体为父物体,在卫星(子物体)的脚本中编写以下代码实现公转,此时地球可以按照自己的脚本设置进行自转。
csharp 复制代码
void Update()
{
    float rotateSpeed = 120;
    Transform parent = this.transform.parent;
    parent.Rotate(0, rotateSpeed * Time.deltaTime, 0, Space.Self);
}
  1. 引用脚本组件:以点击Game界面控制风扇转动为例(Cube代替风扇):
    在游戏主控中获取物体fanNode(名字可自行指定);获取鼠标点击后编写方法控制所控物体转动,风扇转速为180;将风扇物体拖动到FanNode下;在风扇物体FanLogic组件中定义了转速rotateSpeed,但并未设置值;运行游戏,点击Game游戏窗口,可看到风扇转动,其rotateSpeed的值由0变为180。
  2. 运行时实时调试:如何保存运行时调节的参数:无额外补充说明。
  3. 访问别的物体挂载的组件:在当前物体脚本中创建一个要引用的组件名的组件类型,将要引用的脚本所属的物体拖到该组件名中。
  4. 直接通过gameObject获取当前脚本所挂载的游戏物体名字:如下,控制台打印出当前游戏物体的名字(无具体代码,可通过Debug.Log(gameObject.name);实现)。
  5. 欧拉角和四元数:无额外补充说明。
  6. 引用场景内游戏物体:Unity中通过定义public GameObject类型变量,可在编辑器中将场景内的游戏物体拖入该变量完成引用,进而在代码中获取/操作该物体的名称、标签、层级、激活状态等核心属性。
    示例:在Empty挂载的脚本中定义Cube(名字任意),然后将场景内的游戏物体Cube拖入该变量完成引用。

六、输入控制

  1. 鼠标键盘输入:Unity 的 Input 类是专门处理玩家输入的核心类,用来获取键盘、鼠标、触屏、手柄的操作,实现角色移动、点击、按键触发等功能,是游戏交互的基础。
  2. 核心常用方法:
    Input.GetKeyDown(KeyCode):按下瞬间执行一次(比如开枪、跳跃)
    Input.GetKey(KeyCode):按住时持续执行(比如走路)
    Input.GetKeyUp(KeyCode):松开瞬间执行一次
    Input.GetMouseButton(0):鼠标左键检测(0 = 左,1 = 右,2 = 中)
    Input.GetAxis("Horizontal"):获取水平轴输入(WASD / 方向键,值:-1~1)

七、向量相关

Vector 向量是 Unity 中表示方向、位置、位移、速度的核心数学结构,本质是带有大小和方向的数值,常用 Vector2(2D)、Vector3(3D),包含 x/y/z 三个分量,可直接运算、计算距离、控制移动,是游戏开发最基础也最重要的数据类型。

  1. 常用类型:
  • Vector2:用于 2D 游戏、UI、平面坐标,分量 (x, y)
  • Vector3:用于 3D 物体位置、旋转、移动,分量 (x, y, z)
  1. 常用静态常量(直接用):
  • Vector3.zero → (0,0,0);- Vector3.one → (1,1,1);- Vector3.up → (0,1,0) 向上;- Vector3.down → (0,-1,0) 向下;- Vector3.right → (1,0,0) 向右;- Vector3.left → (-1,0,0) 向左;- Vector3.forward → (0,0,1) 向前;- Vector3.back → (0,0,-1) 向后
  1. 常用属性与方法:
  • magnitude:向量长度(两点间距离);- sqrMagnitude:长度平方(计算更快,用于距离比较);- normalized:归一化向量,长度变为 1,只保留方向;- Vector3.Distance(a, b):计算 a、b 两点距离;- Vector3.Lerp(a, b, t):线性插值,用于平滑移动;- Vector3.MoveTowards(a, b, maxDistance):向目标点移动;- 支持加减乘除运算:Vector3 c = a + b、a * speed 等
  1. 典型用途:
  • 表示物体位置:transform.position;- 表示移动方向:transform.Translate(dir * speed * Time.deltaTime);- 表示速度、力、加速度;- 计算两点之间方向与距离,用于寻路、追踪、攻击判定。

八、标签与图层

  1. 标签Tag:给同一类模型设置同样的标签;可添加新标签,也可统一选中物体,批量进行标签设置。
  2. 通过Tag标签查找物体:创建一个空物体DeskTrigger,挂载下面的脚本,按下Z键,带Desks标签的物体统一向上移动,松开Z键降下。
csharp 复制代码
using UnityEngine;
using System.Collections;

public class DeskTrigger : MonoBehaviour
{
    private GameObject[] m_Desk;

    void Start()
    {
        // 按标签查找所有桌子
        m_Desk = GameObject.FindGameObjectsWithTag("Desks");

        // 打印找到的桌子名字(调试用)
        for (int i =< m_Desk.Length; i++)
        {
            Debug.Log(m_Desk[i].name);
        }
    }

    void Update()
    {
        // 按下Z键升起桌子
        if (Input.GetKeyDown(KeyCode.Z))
        {
            DesksUp();
        }

        // 松开Z键降下桌子
        if (Input.GetKeyUp(KeyCode.Z))
        {
            //down.
            DesksDown();
        }
    }

    // 桌子升起
    void DesksUp()
    {
        for (int i = 0; i < m_Desk.Length; i++)
        {
            m_Desk[i<Transform>().Translate(Vector3.up * 2, Space.Self);
        }
    }

    // 桌子降下
    void DesksDown()
    {
        for (int i = < m_Desk.Length; i++)
        {
            m_Desk[i].Get<Transform>().Translate(Vector3.up * -2, Space.Self);
        }
    }
}
  1. 修改图层:无额外补充说明。

九、预设体相关

  1. 预设体(Prefab):预先准备的物体,可以重复使用,直接拖动物体到Assets下(建议创建一个Prefab文件夹),可将物体变为预制体。
  2. 预设体的好处:修改一个预制体,点击Apply,其他预制体统一都会被改变。
  3. 预设体和变体、导出预设体、快速选择预设体和打开:无额外补充说明。

十、项目文件相关

  1. .meta文件:每个对象都有一个.mata文件,是该对象的说明文件。
  2. 添加新场景:无额外补充说明。
  3. 项目文件的导出、打包、导入:无额外补充说明。
  4. PC端游戏打包:最重要的是.exe文件和Data文件夹,发给别人时需将.exe和Data文件夹一起发送。

十一、粒子系统

创建粒子系统


去掉外轮廓

粒子形状

默认是一个圆形的粒子,新创建一个Material,将其拖动到粒子系统的Renderer的Material下,粒子形状变为方形。

Billboard广告牌模式

让一个物体(图片 / 模型)永远朝向相机(玩家视角)就像现实中的广告牌,不管你站在哪一边,它都正对着你。

给粒子贴图

一般使用黑底或者透明底,白底很少用因为很难去掉

算法会自动将黑色底去掉。

按照下面的步骤实现星星的粒子系统效果

粒子系统的参数

Unity 粒子系统常用参数表
1. 主设置(Main)
参数 作用
Looping 循环播放
Start Lifetime 粒子存活时间
Start Speed 粒子飞多快
Start Size 粒子大小,可以设置为大小不同
Start Color 粒子颜色,也可随机
2. 发射(Emission)
参数 作用
Rate over Time 每秒喷多少
3. 形状(Shape)
参数 作用
Shape 发射形状(球形/锥形)
Radius 发射范围
4. 生命周期效果
参数 作用
Color over Lifetime 颜色渐变(做消失效果)
Size over Lifetime 大小渐变
5. 渲染(Renderer)
参数 作用
Material 粒子图片
Render Mode Billboard(朝向相机)
6. 粒子系统模拟空间
模拟空间 意思 适合效果
World(世界) 粒子留在场景里,不跟着发射器跑 泡泡、烟雾、爆炸
Local(本地) 粒子粘在物体上,跟着一起跑 火箭尾焰、枪口火
相关推荐
郝学胜-神的一滴14 小时前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal
田鸡_1 天前
Unity新输入系统(Input System)教学篇
unity·游戏引擎·游戏程序
EQ-雪梨蛋花汤1 天前
【Unity笔记】Unity 音游模板与免费资源:高效构建节奏游戏开发全指南
笔记·unity·游戏引擎
星辰徐哥1 天前
Unity基础:游戏对象的激活与隐藏:SetActive方法详解
游戏·unity·lucene
微莱羽墨1 天前
零、0基础入门Unity 安装详细教程(2026最新版教程,安装Unity看这一篇就够了!)
unity·游戏引擎·unity安装
星辰徐哥1 天前
Unity C#入门:变量的定义与访问权限(public/private)
unity·c#·lucene
nnsix1 天前
Unity 刚体的 默认力、瞬时力 区别
unity·游戏引擎
nnsix1 天前
Unity Sprite的 Generate Physics Shape 参数解释
unity·游戏引擎
魔士于安1 天前
Unity完整小球迷宫项目
前端·unity·游戏引擎·贴图·模型