一、坐标系相关Unity 坐标系Unity 采用左手坐标系世界坐标以场景原点 (0,0,0) 为中心X 轴向右、Y 轴向上、Z 轴向屏幕内为正方向物体自身还有局部坐标系自身坐标移动、旋转、缩放默认基于自身轴也可切换为世界轴。UI 与 2D 常用屏幕坐标系以左下角为原点右上角为屏幕宽高还会用到视口坐标与像素坐标各类坐标可通过 Camera.main.WorldToScreenPoint 等方法相互转换场景中位置、向量、移动都严格遵循这套坐标规则。轴的对应关系Z轴 forward向前、X轴 right向右、Y轴 up向上。二、场景与视图操作Scenes场景和Game的概念场景是我们的设置画面Game是玩家实际看到的游戏场景play状态下的更改不会被保存。如何创建物体以及拖动物体如何沿着固定轴移动Create - 3D Object点击箭头不放拖动可沿着某个固定轴拖动点击面不放拖动可沿着某个面拖动。Perspective和IsometricPerspective为透视图Isometric为正交视图一般用于对齐。快速从不同方向观察物体点击右上角世界坐标轴的中点右键进行切换。打开天空背景和栅格调节栅格透明度一个小栅格对应现实世界1m非硬性规定。​摄像机与视图同步点击摄像机再点击快捷键Align With View可以快速将摄像机拍摄画面转换为当前调节观察的画面。摄像机属性可更改Game场景的颜色。如何调节透视畸变把照相机的视场角(Field of View)调小一点。物体的隐藏以隐藏灯光为例隐藏后场景明显变暗。打开Look View Selected可使场景跟随物体运动。如何调出Console通过Unity顶部Window-General-Console调出。三、物体相关操作贴图将图片拖动到材质球上再将材质球拖动到要贴图的物体上。父子物体坐标系位置关系相对坐标Position和Local Position的区别Center与Pivot的区别。空物体的两个作用1节点的组织和管理两个物体没有明显的父子关系但想要作为一个整体使用可以用空物体作为共同的父物体。2标记一个位置。父子关系示例——创建一个叫desk的空物体将桌子所有的cube拖动到desk下可通过只选中desk移动整个桌子移动父亲儿子会跟着移动移动儿子父亲不会跟着移动。​​​​快捷键QWERTY无额外补充说明Q选择、W移动、E旋转、R缩放、T Rect工具、Y变换工具。旋转中心旋转中心为物体的中心点想实现门的旋转效果有两种案例案例一创建一个空物体命名为DoorParent)移动位置与门Cube形成父子关系通过旋转空物体DoorParent实现门的旋转效果。案例二给DoorParent添加如下的Door脚本文件实现按下Z键开门松开Z键关门。usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassDoor:MonoBehaviour{privateTransformm_Transform;// Start is called before the first frame updatevoidStart(){m_TransformgameTransform();}// Update is called once per framevoidUpdate(){if(Input.GetKeyDown(KeyCode.Z)){//open.OpenDoor();}if(Input.GetKeyUp(KeyCode.Z)){//open.CloseDoor();}}voidOpenDoor(){m_Transform.Rotate(Vector3.up,90);}voidCloseDoor(){m_Transform.Rotate(Vector3.up,-90);}}四、组件相关组件基础一个组件是一个功能添加组件如重力刚体创建自己的C#脚本创建空物体添加多个组件、组件的复制、粘贴组件值。Transform组件最基本的组件组件相当于一个类Transform有position、rotation、scale三个属性Reset可以快速回到原点0,0,0如下图可通过调整数值改变物体位置等。Mesh Filter和Mesh RendererMesh Filter负责存储 / 提供 3D 物体的几何形状数据比如立方体、球体的顶点、面、法线等相当于 “存储模型形状的容器”。Mesh Renderer负责将 Mesh Filter 提供的形状数据结合材质 / 光照等绘制到屏幕上将物体显示出来相当于 “把形状渲染出来的画笔和画布”。光源组件默认有一个Directional LightUnity中还提供了Point Light(电灯泡)、Spotlight(聚光灯)也可以随意创建一个灯光改变光源类型修改Type属性。刚体组件Rigidbody添加了刚体组件物体就有了重力添加刚体步骤Add Component→Rigidbody。刚体组件的属性Mass(质量)、Drag(阻力阻力设置太大物体会停止运动)、Angular Drag(角阻力阻力设置太大物体会停止运动)当上面的物体砸到下面的物体时把下面的物体的角阻力设置较大下面的物体旋转会较慢。使用刚体来移动游戏物体此时物体在移动时会和其他物体发生碰撞不会直接穿透。usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassNewBehaviourScript:MonoBehaviour{publicfloatmoveSpeed5f;privateRigidbodyrb;privateVector3moveDir;voidStart(){// 获取物体上的刚体组件rbGetComponentRigidbody();}voidUpdate(){// 获取输入方向floathInput.GetAxisRaw(Horizontal);floatvInput.GetAxisRaw(Vertical);moveDirnewVector3(h,0,v).normalized;}voidFixedUpdate(){// 刚体物理移动if(moveDir.magnitude0.1f){rb.velocitymoveDir*moveSpeed;}else{rb.velocityVector3.zero;}}}碰撞体组件Collider碰撞的目标物体就是“碰撞体”碰撞物体实际是碰撞该物体的Box Collider两个物体相撞实际上是两个物体的Collider进行碰撞加了刚体就必须加碰撞体否则没意义。只加刚体不加碰撞体物体会直接掉下去。创建物体时自带了Collider。四种场景直观清晰展示不同情况下的效果触发器碰撞体勾选 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脚本usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassDoorTrigger:MonoBehaviour{// 这里要和你的门脚本类型对应是Door不是DoorTriggerprivateDoorm_Door;voidStart(){// 查找场景中名为DoorParent的物体并获取Door组件m_DoorGameObject.Find(DoorParent).GetComponentDoor();}// 当物体进入触发器时触发voidOnTriggerEnter(Collidercoll){// 注意字符串必须用双引号不是单引号if(coll.gameObject.nameStudent){m_Door.OpenDoor();}}// 当物体离开触发器时触发voidOnTriggerExit(Collidercoll){if(coll.gameObject.nameStudent){m_Door.CloseDoor();}}}Door脚本usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassDoor:MonoBehaviour{privateTransformm_Transform;// Start is called before the first frame updatevoidStart(){m_TransformgameObject.GetComponentTransform();}// Update is called once per framevoidUpdate(){if(Input.GetKeyDown(KeyCode.Z)){// openOpenDoor();}if(Input.GetKeyUp(KeyCode.Z)){// openCloseDoor();}}publicvoidOpenDoor(){m_Transform.Rotate(Vector3.up,90);}publicvoidCloseDoor(){m_Transform.Rotate(Vector3.up,-90);}}五、脚本相关脚本基础在Unity中可在Assets文件夹下新建Scripts文件夹统一存放所有.cs脚本。脚本的生命周期执行顺序Awake → OnEnable → Start → Update → FixedUpdate → LateUpdate → OnDisable → OnDestroy可设置优先级值改变优先级执行顺序。核心方法说明Update ()帧更新方法默认每秒约执行60次可通过Time.time获取游戏总运行时间、Time.deltaTime获取帧间隔时间。Awake () 与 Start ()执行顺序为所有脚本先运行Awake () 再运行Start ()Awake () 在物体激活时就会执行即便脚本取消勾选也会调用Start () 仅在脚本启用时才执行常用于后续逻辑初始化。编写代码控制物体的运动匀速运动定义移动速度移动距离为 speed*Time.deltaTime。欧拉角-物体的旋转匀速旋转定义转速旋转角度为 转速*Time.deltaTime。自转和公转模拟地球卫星系统在地球处设置一个空物体为父物体在卫星子物体的脚本中编写以下代码实现公转此时地球可以按照自己的脚本设置进行自转。voidUpdate(){floatrotateSpeed120;Transformparentthis.transform.parent;parent.Rotate(0,rotateSpeed*Time.deltaTime,0,Space.Self);}引用脚本组件以点击Game界面控制风扇转动为例Cube代替风扇在游戏主控中获取物体fanNode(名字可自行指定)获取鼠标点击后编写方法控制所控物体转动风扇转速为180将风扇物体拖动到FanNode下在风扇物体FanLogic组件中定义了转速rotateSpeed但并未设置值运行游戏点击Game游戏窗口可看到风扇转动其rotateSpeed的值由0变为180。运行时实时调试如何保存运行时调节的参数无额外补充说明。访问别的物体挂载的组件在当前物体脚本中创建一个要引用的组件名的组件类型将要引用的脚本所属的物体拖到该组件名中。直接通过gameObject获取当前脚本所挂载的游戏物体名字如下控制台打印出当前游戏物体的名字无具体代码可通过Debug.Log(gameObject.name);实现。欧拉角和四元数无额外补充说明。引用场景内游戏物体Unity中通过定义public GameObject类型变量可在编辑器中将场景内的游戏物体拖入该变量完成引用进而在代码中获取/操作该物体的名称、标签、层级、激活状态等核心属性。示例在Empty挂载的脚本中定义Cube(名字任意)然后将场景内的游戏物体Cube拖入该变量完成引用。六、输入控制鼠标键盘输入Unity 的 Input 类是专门处理玩家输入的核心类用来获取键盘、鼠标、触屏、手柄的操作实现角色移动、点击、按键触发等功能是游戏交互的基础。核心常用方法Input.GetKeyDown(KeyCode)按下瞬间执行一次比如开枪、跳跃Input.GetKey(KeyCode)按住时持续执行比如走路Input.GetKeyUp(KeyCode)松开瞬间执行一次Input.GetMouseButton(0)鼠标左键检测0 左1 右2 中Input.GetAxis(“Horizontal”)获取水平轴输入WASD / 方向键值-1~1七、向量相关Vector 向量是 Unity 中表示方向、位置、位移、速度的核心数学结构本质是带有大小和方向的数值常用Vector22D、Vector33D包含 x/y/z 三个分量可直接运算、计算距离、控制移动是游戏开发最基础也最重要的数据类型。常用类型Vector2用于 2D 游戏、UI、平面坐标分量 (x, y)Vector3用于 3D 物体位置、旋转、移动分量 (x, y, z)常用静态常量直接用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) 向后常用属性与方法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 等典型用途表示物体位置transform.position- 表示移动方向transform.Translate(dir * speed * Time.deltaTime)- 表示速度、力、加速度- 计算两点之间方向与距离用于寻路、追踪、攻击判定。八、标签与图层标签Tag给同一类模型设置同样的标签可添加新标签也可统一选中物体批量进行标签设置。通过Tag标签查找物体创建一个空物体DeskTrigger挂载下面的脚本按下Z键带Desks标签的物体统一向上移动松开Z键降下。usingUnityEngine;usingSystem.Collections;publicclassDeskTrigger:MonoBehaviour{privateGameObject[]m_Desk;voidStart(){// 按标签查找所有桌子m_DeskGameObject.FindGameObjectsWithTag(Desks);// 打印找到的桌子名字调试用for(intim_Desk.Length;i){Debug.Log(m_Desk[i].name);}}voidUpdate(){// 按下Z键升起桌子if(Input.GetKeyDown(KeyCode.Z)){DesksUp();}// 松开Z键降下桌子if(Input.GetKeyUp(KeyCode.Z)){//down.DesksDown();}}// 桌子升起voidDesksUp(){for(inti0;im_Desk.Length;i){m_Desk[iTransform().Translate(Vector3.up*2,Space.Self);}}// 桌子降下voidDesksDown(){for(intim_Desk.Length;i){m_Desk[i].GetTransform().Translate(Vector3.up*-2,Space.Self);}}}修改图层无额外补充说明。九、预设体相关预设体Prefab预先准备的物体可以重复使用直接拖动物体到Assets下(建议创建一个Prefab文件夹)可将物体变为预制体。预设体的好处修改一个预制体点击Apply其他预制体统一都会被改变。预设体和变体、导出预设体、快速选择预设体和打开无额外补充说明。十、项目文件相关.meta文件每个对象都有一个.mata文件是该对象的说明文件。添加新场景无额外补充说明。项目文件的导出、打包、导入无额外补充说明。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 ModeBillboard朝向相机6. 粒子系统模拟空间模拟空间意思适合效果World世界粒子留在场景里不跟着发射器跑泡泡、烟雾、爆炸Local本地粒子粘在物体上跟着一起跑火箭尾焰、枪口火锥形锥形粒子系统默认Z轴向上颜色渐变控制点数量最多支持8个。粒子大小添加如下参数通过这里的size控制粒子的大小。可以编辑曲线曲线描述了粒子大小的变化过程。练习实现彩色气球放飞的效果随机两个颜色选择Box形状点击编辑形状公式切换到顶视图编辑Box形状