Unity基础笔记(1)—— Unity基本操作与基本组件介绍

Unity 基本操作与组件

一、Unity 基本操作

1. Unity 界面详解
  • Hierachy:层级面板,游戏场景中的资源,比如UI、模型;

  • Scene:场景面板,用于管理游戏场景中的各种游戏物体;

  • Game:游戏场景面板,实际的玩家视角;

  • Project:项目面板,用于管理项目中的所有资源;

  • Inspector:检查面板,可以理解为属性窗口,查看 Hierachy 或 Project 中资源的属性。

2. Unity 游戏场景

游戏场景概念:

​ 一个游戏可以有多个场景,游戏场景是由游戏对象组成的,一个场景就相当于是一个独立的世界,我们可以简单的把游戏场景理解成是游戏对象的一个容器。

​ 创建项目时会默认创建一个 SampeScene 场景文件,Unity 中场景是以文件形式存在的

游戏场景漫游:

​ 由于Game面板是玩家视角,不方便观察,所以我们会在Scene面板中使用上帝视角来开发游戏。

​ 首先,可以点击Scene面板中任意地方,达到选中Scene面板的目的。

鼠标右键(按住):拖动鼠标旋转视角,WASD场景漫游;

鼠标中键:拖动鼠标平移视角

ALT键(按住)再按住鼠标右键,拖动前后缩放。

二、Unity 常用组件

1. 组件介绍

组件概念:

对于现实中的电脑来说,电脑里面的硬盘、内存条都是电脑的组件,其共同特点在于 可替换性

游戏组件:

Unity 的设计思想是基于组件,角色可以移动、角色可以播放动画、UI可以点击等等,一切都是基于组件。

Unity 中包含大量的系统,比如UI系统,UI系统中有按钮、图片、下拉框,这些功能都是不同的组件,这些组件组合在一起就是 UI系统。

2. Unity 内置简易模型和材质

模型介绍:

模型是一种美术资源,3D游戏中,场景、角色、武器等立体的元素一般都是模型。学习阶段我们可以使用Unity内置的简易模型来学习引擎操作。

添加模型步骤:在层级面板中 右键点击 --> 3DObject --> 各种模型

材质介绍:

模型本身是由“顶点组成的网格数据”,本身并不存在颜色。

材质决定了模型的实际外观,由于我们使用的是Unity内置模型,和模型一样,材质也是一种资源。

3. Scene 界面游戏物体操作

工具栏:

  • 手性工具,快捷键Q,用来拖动场景;
  • 移动工具,快捷键W,用来移动模型位置;
  • 旋转工具,快捷键E,用来旋转模型;
  • 缩放工具,快捷键R,用来放大缩小模型;
  • 移动&缩放工具,快捷键Y,可以同时移动、旋转模型。

以上都是在改变游戏物体的Transform组件中的各项数值。

约束与吸附

  • 变化约束:移动、缩放、旋转时按住Ctrl可以约束移动距离、缩放程度、旋转程度等,具体的约束程度可以在 Edit --> Grid And Snap 中可以设置。
  • 模型吸附:选择模型后按V,选择吸附位置再拖拽到需要吸附的位置上。

复制模型:Ctrl + c,粘贴模型:Ctrl + v,快速复制:Ctrl + D,快速定位:F.

4. 自定义组件

为什么要自定义组件?

​ Unity中提供的组件,都是单一功能。本身并没有复杂的业务逻辑,比如 Transform 组件确实可以位移角色,但是什么时候位移要由我们来决定。

​ 一般情况下,我们写的组件大多与游戏逻辑有关,比如玩家控制脚本。

创建组件:

​ Unity 的设计思想是基于组件,所有我们的代码本质上也是一个组件,比如我们写一个功能让角色可以移动,那这个C#文件也是一个组件,可以挂载到游戏物体上,挂载后就可以生效。

​ 创建组件步骤:项目面板中 右键点击 -> 创建 -> C#脚本,将脚本拖拽到游戏物体上即可。

组件特点:

​ 我们在Unity中创建的脚本,不一定非要是组件,那么怎么样确定一个脚本是组件?

  1. 继承了MonoBehaviour的类的都是组件;
  2. Unity 中创建脚本默认就是继承了MonoBehaviour;
  3. 只有组件才可以挂载到游戏物体身上

组件的学习方法:

主要从两个方面进行学习

  1. Inspector 面板,组件在 Inspector 面板中一般都会有一些属性可以设置,那我们需要研究的是这些属性的设置对于游戏物体有什么影响;
  2. C# 脚本,部分 Inspector 面板中的属性,我们因功能需求需要使用脚本来控制其发生变化。

5. Transform 组件

Transform组件介绍:

Transform组件的三个主要数值

  • Position:位置
  • Rotation:旋转
  • Scale:缩放

Transform其实还包含了游戏物体在层级面板中的层级信息,后续会具体在代码中使用到。

transform.position表示 当前位置

transform.rotation表示 当前旋转

transform.localScale表示 当前缩放

如何修改 transform 中的值: transform.position = new Vector3(1, 1, 1);

Transform 组件常用属性和方法:

属性:

  1. childCount:子物体数量;
  2. parent:父物体的 Transform组件;
  3. root:最高级别父物体;
  4. position、eulerAngles(代表旋转修改值,不能直接使用rotation)、localScale.

方法:

  1. Find (string) :查找子物体;
  2. Translate (Vector3) :朝着一个坐标移动;
  3. Rotate (Vector3) :旋转一个角度;
  4. LookAt (Transform) :看向目标。

Transform组件的特殊性:

​ 在自定义的组件中,我们可以直接 使用变量transform来访问到当前游戏物体身上的Transform组件

6. GameObject

GameObject是什么?

​ GameObject 就是游戏对象或者说游戏物体,层级面板中可以选择的都是GameObject。

​ 同时,GameObject在代码中也是一个类型,这个类型代表着游戏物体。在C#中可以通过公开字段,在Inspector面板中设置该字段的值。

组件中可以使用来自基类继承的 gameObject 属性,直接访问脚本所在的游戏物体,类似 transform.

gameObject:直接获取当前组件所在的游戏物体;

transform:组件所在游戏物体的transform组件。

GameObject 常用属性和方法

属性:

  1. name:游戏物体名称,和层级面板中等同;
  2. tag:游戏物体的标签;
  3. activeInHierarchy:是否为 显示状态;
  4. transform:这个游戏物体的变换组件;
  5. static GameObject Find (string path) :一个静态方法,查找游戏物体。

方法:

  1. GetComponent ():获取游戏物体身上的组件,T代表要查找的类型,类似的方法有很多;
  2. SetActive(bool) :修改显示状态。

7. 预制体 Prefab

预制体的概念:预先制作好的游戏物体。

预制体的创建:

​ 直接将游戏物体拖拽至 项目面板 中,Unity会自动为我们生成一个预制体。

预制体的使用:

​ 将预制体从项目面板中拖拽至层级面板中来达到复用的效果。

  • 基于预制体创建的游戏物体比较接近 “引用关系” ,我们修改预制体会直接导致场景中的游戏物体发生变化。
  • 预制体被删除,不会影响游戏中的游戏物体,但是游戏物体会在层级面板中变成红色,意味着预制体被删除了,我们可以在层级面板中右键取消这种引用关系,让这个游戏物体变成普通游戏物体。
  • 预制体的修改具备特殊性,需要双击进入“异世界”进行编辑。

预制体的修改:

​ 预制体可以嵌套,即预制体套预制体。预制体修改无法撤销。

变体:

​ 创建预制体的过程中,如果游戏物体已经是预制体,Unity会弹窗提醒我们选择创建模式,即:

  1. 原始预制体:一个完全独立的预制体;
  2. 预制体变体:旧的预制体变化,变体也会发生变化,但是变体保留和旧预制体不同的部分。

(从一个预制体中创建一个原始预制体,原始预制体改变,两个预制体都改变;而从该预制体中创建预制体变体,变体改变,该预制体不变,该预制体改变,变体却会改变)

8. Unity 生命周期函数

概念:在unity中指一个组件从激活到销毁的整个过程。

常用生命周期函数:

Awake():唤醒事件,一开始就执行,只执行一次

OnEnable():启用事件,每次启用都执行一次。每当脚本组件被启用的时候就执行一次

Start():开始事件,执行一次

FixedUpdate()固定更新事件,执行N次,0.02秒执行一次。所有物理相关的更新都在这个事件中处理。

Update():更新事件,执行N次,每帧执行一次,会受到帧率的影响。

LateUpdate()稍后更新事件,执行N次,在Update () 事件执行完毕后再执行

OnDisable():禁用事件,每次禁用都执行一次。在OnDestroy () 事件也会执行。

OnDestory():销毁事件,执行一次。当组件被销毁时执行。

(上述生命周期函数顺序即为 Unity 生命周期顺序)

9. Invoke 函数

Invoke( ) 函数:用于在特定时间间隔内调用、执行特定方法

Invoke函数常用执行方法

// 输入一个方法名称,过几秒来执行一次
Invoke(string methodName, float time){}

// 重复调用
InvokeRepeating(string methodName, float time, float repeatRate){}
    
// 取消调用,使用无参重载就是取消全部调用
CancelInvoke(string methodName){}
    
/*
    methodName:表示方法名称;
    time:表示几秒后执行;
    repeatRate:表示重复间隔时间。
*/

10. 协程

协程的概念:

协程即 “协同程序” ,并不等同于多线程。协程的本质是迭代器

Unity 中,协程就是一个能暂停协程执行,暂停后立即返回主函数,执行主函数剩余部分,直到中断指令完成后,从中断指令的下一行继续执行协程剩余的函数。

函数体全部执行完成,协程结束。由于中断指令的出现,使得可以将一个函数分割到多个帧里去执行。

协程的使用场景:

  1. 延时调用某个函数;
  2. 某块逻辑要一直循环判断执行。

为什么需要协程?

主程序已经在执行某个任务,希望”同时运行“其他逻辑,这里的同时,并不是多线程意义上的同时,只是感官上同时。

如何定义协程函数:

public IEnumerator Demo()  // 协程特定返回值IEnumerator
{
    Debug.Log("具体操作1");
    yield return new WaitForSeconds(1.0f);  // 等待一秒
    Debug.Log("具体操作2");
    // 协程不会因为前面返回则不执行后面的代码
}

public void Start()
{
    // 调用协程函数的两种方式
    StartCoroutine(Demo());
    StartCoroutine("Demo");
}

停止协程函数:

协程如果运行到最后一行,意味着停止,但是如果我们想主动停止,则使用下面的方法。

 // 结束全部协程
StopAllCoroutines();
// 结束某个协程用 StopCoroutine
// 和调用协程一样使用,但是如果协程有参数不要使用这个
StopCoroutine(IEnumerator routine); 
// 参数填写协程变量
Coroutine routine = StartCoroutin(Demo());
StopCoroutine(Coroutine routine);
// 参数填写协程方法名
StopCoroutine(string methodName); 

11. 常用工具类

数学工具类
  1. Mathf.Abs(int num):返回绝对值

  2. Mathf.Max(int a, int b):返回更大的值(不限制数量)

  3. Mathf.Min(int a, int b):返回最小的值

  4. Mathf.Round(2.5f)返回四舍五入的值(四舍六入,五取偶数)

  5. Mathf.Ceil(2.5f):返回向上取整的值;

  6. Mathf.Floor(2.5f):返回向下取整的值;

  7. Random.Range(0, 5):返回范围内随机值

    (1)如果是 int 重载:返回0-4的随机值,包含0、不包含5;

    (2)如果是 float 重载:返回0-5的随机值,包含0并包含5。

时间工具类

只读

  • Time.time:表示从游戏运行到现在的时间,会随着游戏的暂停而停止计算;
  • Time.deltaTime:表示从上一帧到当前帧单独时间,以秒为单位;
  • Time.realtimeSinceStartup:表示自游戏开始后的总时间,即使暂停也会增加,也就是现实时间

读写

  • Time.timeScale时间缩放,默认值为 1,若设置 < 1,表示时间减慢,若设置 > 1,表示时间加快,0 意味着游戏暂停。

你可能感兴趣的:(unity,ui)