首页 > 其他分享 >Unity 游戏开发、01 基础篇 | 阿发入门篇全课程学习笔记

Unity 游戏开发、01 基础篇 | 阿发入门篇全课程学习笔记

时间:2023-09-11 09:22:13浏览次数:58  
标签:01 obj void transform 阿发 入门篇 物体 组件 public

Unity Documentation全课程视频第15,24章视频

afanihao Unity入门,全课程内容个人学习笔记,简单部分一笔带过,重点内容带 ⭐


2.3 窗口布局

  • Unity默认窗口布局

    • Hierarchy 层级窗口
    • Scene 场景窗口,3D视图窗口
    • Game 游戏播放窗口
    • Inspector 检查器窗口,属性窗口
    • Project 项目窗口
    • Console 控制台窗口
  • 恢复默认布局 Window | Layouts | Default

  • 调大页面字体 Preference | UI Scaling


3.1 场景

新项目默认创建了 SampleScene 场景 {摄像机,平行光}


3.2 游戏物体

SampleScene 里 {摄像机,平行光} 就是两个游戏物体

添加物体

  • GameObject 下拉菜单
  • Hierarchy 窗口 右键菜单

选中物体(橙色轮廓)(Inspector显示该物体组件属性)

  • Scene 窗口选中
  • Hierarchy 窗口选中 (物体重叠时

重命名、删除物体

  • Hierarchy 窗口选中右键菜单 Rename | Delete

移动物体

  • Move Tool

3.3 ⭐3D视图

视图内容

  • Gizmo 导航器 :表示世界坐标方向
  • Grid 栅格 : 表示 XZ 坐标平面(可隐藏、配置)
    • 栅格1格长度代表1个单位,尺寸单位约定为1米
  • Skybox 天空盒(可隐藏)

视图操作

  • 旋转 ALT + LMB
  • 缩放 鼠标滚轮、ALT + RMB(精细)
  • 平移 MMB

导航器操作 Gizmo

  • 恢复y轴方向:SHIFT+点击小方块
  • 顶视图:点击任意轴 (小方块右键菜单)

3.4 世界坐标系

image-20230901183647643

左手坐标系,当x轴向右,y轴向上,z轴向里


3.5 ⭐视图中心

视图旋转默认按视图中心点旋转

  • 绕一个物体旋转,需要选中物体后按 F 键(层级窗口双击物体),视图中心设置为该物体坐标原点,然后 ALT + LMB 旋转
  • 添加一个新物体,物体位于视图中心,而不是 {0,0,0}

3.6 透视与正交

  • Perspective 透视视图
    • 物体近大远小
    • 透视畸(ji)变:圆球在角落看起来像椭圆
      • 调小Field of view(广角设定)减少畸变
  • Orthographic 正交视图(Isometric 等距视图)
    • 物体大小与距离无关
    • 常用于物体的布局、对齐操作

4.2 ⭐物体操作

可以在 Inspector 窗口拖动 X Y Z

  • Move tool 移动工具(W):沿着坐标轴、坐标平面移动
  • Rotate tool 旋转工具(E)
    • 朝XYZ轴方向旋转,逆时针为正,顺时针为负。反之相反
    • 按住 CTRL 旋转,按 15 度增量旋转(可修改)
  • Scale tool 缩放工具(R):沿着轴向、整体缩放

操作模式

  • Pivot 轴心 | Center 中心点
  • Global 世界坐标系 | Local 局部坐标系

更多操作

  • 多选(层级窗口,视图窗口鼠标拉框)、复制(CTRL + D)
  • 激活 Active :检查器里第一个勾选项

尝试小插件

主要涉及单c#文件插件(切换视图快捷功能)的安装与使用

  • 拖拽进入资源窗口后自动编译
  • AF插件:G 键的视图中心与F键不同,不会放大框显

5.1 ⭐网格

Mesh,存储了模型的形状数据

  • 模型形状由若干个小面围合而成,内部都是中空的
  • Mesh 中包含了 面、顶点坐标、面的法向 等数据

Unity中观察模型网格(场景窗口右侧栏,2D按钮左边)

  • shaded 着色模式,显示表面材质
  • wireframe 线框
  • shaded wireframe 线框着色(两个都显示)

高模:面数越多,物体表面越精细,GPU负担也就越重

mesh filter 组件定义网格数据


5.2 ⭐材质

Material 定义物体的表面细节(颜色,金属,透明,凹陷,突起)

创建、使用材质

  1. 在资源目录下创建 Material
  2. 修改阿贝多albedo为蓝色(反射率)
  3. 选中物体,把材质拖到物体上

mesh renderer 组件负责渲染,使用材质相当于修改该组件的 Materials 字段,可直接拖动材质到该字段或打开材质浏览器。 (检查器窗口右上角可锁定)

image-20230903135337888

5.3 ⭐纹理(贴图)

用一张图定义物体的表面颜色。模型每个面有不同颜色,与贴图映射,在建模软件里完成

将贴图拖动至 albedo,可以看到叠加的效果(反射率改为白色),按 BackSpace 清掉贴图

建模师提供的模型,本身已经带了网格、表面材质、材质贴图


5.5 ⭐更多细节

  • Unity 平面(plane)是没有厚度的;正面可见,背面透明;从正方体从内部观察,六个面都是透明的
  • 添加物体默认都是有材质的 Default-Material (引擎内部自带),呈现紫红色说明没材质

5.6 ⭐FBX

模型资源

FBX模型一般包含 mesh(定义形状),material(定义光学特性),texture(定义表面像素颜色),有的模型可能定义多个材质。将FBX模型拖动至窗口中生成对象(FBX本身也是一种预制体

贴图文件的路径是约定好的,与fbx相同目录,或者同级 Textures 目录


材质替换(重映射)

  • 在检查器窗口找到材质属性 | Use Embeded Materials | On Demand Remap
  • 使用外部材质:材质属性 | Location | Use External Materials | 修改解压的材质

分解重组

  • FBX里的Mesh单独拖出生成对象,然后给定材质(也可从FBX单独拖出)

6.1 ⭐资源文件

复制资源 CTRL + D

  • 模型文件 .fbx
  • 图片文件 .jpg、.png、.psd、.tif
  • 音频文件 .mp3、.wav、.aiff
  • 脚本文件 .cs
  • 材质文件 .mat
  • 场景文件 .unity (记录物体检查器数据)(1个场景等于1个关卡)
  • 描述文件 .meta (每个文件都有)

除此之外,可将选择的文件导出成资源包 .unitypackage ,导出时可把依赖文件一并导出。再通过 .unitypackage 导入 (整个Assets目录也可以导出)


7.1 轴心、几何中心

Pivot 物体操纵基准点,可以在任意位置,轴心点是在建模软件中指定的,可以用空物体当父节点修改原轴心

Center 几何中心点,一个物体绕中心点旋转(炮塔例子)。多个物体则是物体合体之后的中心点


7.2 ⭐父子关系

在 Hierarchy 窗口呈现两个物体之间的关系(拖物体B到物体A下)

  • 子物体会随着父物体移动旋转(子物体相对坐标不会变化)
  • 删除父物体,子物体一并删除

相对坐标:子物体坐标相对于父物体(子物体坐标等于相对坐标+父节点坐标)


7.3 空物体

  • Create Empty
  • 场景内不可见(无网格信息),但有transform组件
  • 用于节点的组织、管理(武器站 + 炮塔)(修改轴心);标记位置

7.4 ⭐Global、Local

  • Global,世界坐标系:上下、东西、南北
  • Local,本地坐标系:上下、前后、左右 (物体自身为轴)(小车沿车头前进)
  • y 轴 up、z 轴 forward (模型正脸方向与z轴方向一般一致)、x轴 right

8.1 ⭐组件

物体节点可绑定多个组件(component ),一个组件代表一个功能

如 Mesh Filter 网格过滤器(加载Mesh);Mesh Renderer 网格渲染器(渲染Mesh)


Transform 所有物体都有、不能被删除(基础组件)

  • 位置(相对位置);旋转(欧拉角);缩放

8.5 ⭐摄像机

  • Z轴为拍摄方向
  • 摆放摄像机:选中节点 | GameObject | Align with View 对齐视角(CTRL+SHIFT+F),将摄像机视角变为当前场景窗口视角

9.1 ⭐脚本

脚本组件

脚本组件,游戏驱动逻辑,类名和文件名需要一致。编译过程是自动的

只有挂载脚本才能被调用:物体节点添加组件拖动到检查器窗口下面

脚本类继承自 MonoBehaviour


获取物体

  • this 当前脚本组件对象
  • this.gameObject 当前物体
  • this.gameObject.name 当前物体名字(利用获取到的物体对象获取其他属性)
  • this.gameObject.transform 获取 transform 组件(简化为this.transform
image-20230907201338483
GameObject obj = this.gameObject;
string objName = obj.name;
Debug.Log(objName);

Transform tr = this.transform; // this.gameObject.transform
Vector3 pos = tr.position;
Debug.Log(pos);

物体坐标

一般常使用 localPosition ,与检查器中的值一致

  • 世界坐标值 this.transform.position
  • 本地坐标值 this.transform.localPosition

修改本地坐标

this.transform.localPosition = new Vector3(0f, 0f, 3.5f);

移动物体

建议先看 10.1 帧更新

不使用 Time.deltaTime 来移动物体是不匀速的(因为时间增量不同)

正确移动方法是 速度 * 时间(每秒走固定米数,每帧移动距离不同)

  void Update()
  {
    Vector3 pos = this.transform.localPosition;
    pos.z += Time.deltaTime * 10f;
    this.transform.localPosition = pos;
  }

9.4 播放模式

  • 编辑模式
  • 播放(运行)模式:更改不保存,相当于实时调试,实时修改参数并生效
    • 把修改好参数的组件 | Copy Component | 退出播放 | Paste Component Values

10.1⭐帧更新

  • Frame 游戏帧
  • FrameRate 帧率/刷新率
  • FPS(Frames Per Second) 每秒更新多少帧

Update(帧更新):每帧调用一次

  • Time.time 游戏时间(游戏启动后开始计时)
  • Time.deltaTime 距上次帧更新的时间差(时间增量)

Unity 不支持固定帧率,但可以设置一个近似帧率 Application.targetFrameRate = 60;


11.1⭐物体运动

物体移动

使用 transform.Translate(dx,dy,dz) 实现相对运动(参数是坐标增量)

可以添加第四个参数即 transform.Translate(dx,dy,dz,space)

  • Space.World 世界坐标系(默认)
  • Space.Self 本地坐标系(更常用)

物体方向

GameObject.Find("Sphere") 根据名字、路径查找物体

this.transform.LookAt(flag.transform) 将物体 Z 轴转向某一位置,然后每帧沿着 forward 方向按 2m/s 速度前进

  void Start()
  {
    GameObject flag = GameObject.Find("Sphere");
    this.transform.LookAt(flag.transform);
  }
  void Update()
  {
    float speed = 2f;
    float distance = speed * Time.deltaTime;
    this.transform.Translate(0,0,distance,Space.Self);
  }

两物体间距

Vector3 的 magnitude 属性表示向量长度

    Vector3 p1 = this.transform.position;
    Vector3 p2 = flag.transform.position;
    Vector3 p = p2 - p1;
    float distance = p.magnitude;

物体移动到另一物体停止移动

 private GameObject flag;
  void Start()
  {
    flag = GameObject.Find("Sphere");
    this.transform.LookAt(flag.transform);
  }
  void Update()
  {
    Vector3 p1 = this.transform.position;
    Vector3 p2 = flag.transform.position;
    Vector3 p = p2 - p1;
    float distance = p.magnitude;
    if (distance > 0.3f)
    {
      float speed = 2f;
      float dis = speed * Time.deltaTime;
      this.transform.Translate(0,0,dis,Space.Self);
    }
  }

摄像机跟随物体

选择物体,Edit | Lock View to Selected (SHIFT + F)


12.1⭐物体旋转

Quaternion 四元组

transform.rotation 不便操作,不建议使用

Euler Angle 欧拉角

  • transform.eulerAngles
  • transform.LocalEulerAngles
this.transform.localEulerAngles = new Vector3(0, 30, 0);

Vector3 angles = this.transform.localEulerAngles;
angles.y += 30 * Time.deltaTime;
this.transform.localEulerAngles = angles;

transform.Rotate(dx,dy,dz,space)Translate 使用方式类似

实现公转:父物体带动子物体旋转

image-20230907213737774

13.1 脚本运行

场景加载过程(框架自动完成)

  1. 创建节点(游戏物体)
  2. 实例化各个节点的组件(包括脚本组件)| 等同 new 类()
  3. 调用各个组件事件函数

13.2 消息函数

属于 MonoBehaviour (统一行为特性类)的消息函数(事件函数、回调函数)

已被禁用的物体 Start / Update 不会被调用,Awake / Start 方法只会被执行一次

  • Awake 第一阶段初始化(总是会被调用)
  • Start 第二阶段初始化(组件被禁用不调用)
  • Update 帧更新
  • OnEnable 当组件启用时调用
  • OnDisable 当组件禁用时调用

标签:01,obj,void,transform,阿发,入门篇,物体,组件,public
From: https://www.cnblogs.com/linxiaoxu/p/17692668.html

相关文章

  • SDOI2015 序列统计
    题目链接description给定一个质数\(m\),以及\(n,x\)和集合\(S\)。从集合\(S\)中任意选数构成长度为\(n\)的数列(一个数可以选多次),求数列元素乘积模\(m\)等于\(x\)的数列的数量。模\(1004535809\)。\(3\leqm\leq8000\)\(1\leqn\leq10^9\)\(|S|\leqm,0\leqx<m......
  • 相应拦截器----关注500和401
    关注相应码,不同的码对应不同的错误200没问题401说明没权限或者登录已经过期5开头的可能是后端代码出现问题了请求超时请求超时定义的毫秒来测把自己踢出去,提示登录已超时,然后报错401......
  • [GAMES101] 我的结课打卡
    ......
  • 2018-2019 9th BSUIR Open Programming Championship
    I.EqualModSegments\(1\leqn\leq1e5\)\(1\leqa_i\leq3e5\)题解:ST表+扫描线+二维偏序取模存在一个不错的性质:\(x\%p\)要么\(x\)不变,要么\(x\)至少整除\(2\)所以我们考虑固定左端点\(l\),存在\(log\a_l\)段区间,使得右端点\(r\)在每段区间\([p,q]\)内\(......
  • JavaNote05-面向对象编程01
    0.面向对象内容的三条主线Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类面向对象的特征:封装、继承、多态、(抽象)其他关键字的使用:this、super、package、import、static、final、interface、abstract等1.面向对象编程概述面向对象是软件开发中的一类编程风......
  • [JOISC 2016] 雇佣计划 题解
    [JOISC2016]雇佣计划题解这里补充一篇自己的\(n\logn\)做法。本蒟蒻打了两棵线段树,并且进行了繁琐的分类讨论,完全被标算的树状数组吊打qwq题意:给定一个序列\(a\),有两种操作:将\(c\)位置权值改为\(d\);给定一个权值\(b\),定义集合\(S=\{i|a_i\geb\}\),对于......
  • 2019-2020 ACM-ICPC Brazil Subregional Programming Contest
    D.DenouncingMafia给定一颗树,然后给定\(k\)个起点,对于每个起点来说,从该点到根节点的一条链都会被染色,求最多有几个点会被染色\(3\leqn\leq1e5,1\leqk\leqn\)题解我们贪心的来看,起点一定会选择在叶子节点,假设叶子节点的数量为\(cnt\),所以如果\(k\geqcnt\),那么......
  • The adjoint technique - 2019
    SIGGRAPH2019:DeepLearningforContentCreationandReal-TimeRendering-Theadjointtechnique-Video作者:JosStam,NVIDIASIGGRAPH 2019InthistalkIwillpresenttheadjointmethod–-ageneraltechniqueofcomputinggradientsofafunctionorasim......
  • Cisco Catalyst 8000 边缘平台系列 IOS XE 17.12.01 发布
    CiscoCatalyst8000SeriesEdgePlatforms,IOSXEReleaseDublin-17.12.01aEDCiscoCatalyst8000边缘平台系列请访问原文链接:https://sysin.org/blog/cisco-catalyst-8000/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCiscoCatalyst8000:随心所欲访问位于......
  • P3533 [POI2012] RAN-Rendezvous 题解
    P3533[POI2012]RAN-Rendezvous题目大意:给定外向树森林,每次给定两个起始点,求两个点沿边移动最少步数相遇。\(n\)个点,\(n\)条边,并且每个点有唯一的出边,显然构成了多棵基环树,对于每个基环树分别处理:找出环上的点,因为要求支持求出任意两点距离,前缀和一下即可。对于询问,如果在两......