Unity基础知识及一些基本API的使用

Unity基础知识及一些基本API的使用


1.Unity界面介绍

在这里插入图片描述
Unity的默认Editor窗口主要呈现为以上布局,它们分别为:

1.工具栏:工具栏提供最基本的工作功能。左侧的按钮用于访问 Unity Collaborate、Unity 云服务和 Unity 帐户。中间是播放、暂停和步进控制工具。右侧是操作历史记录、操作查询以及层可见性菜单,最后是 Editor 布局菜单(提供一些备选的 Editor 窗口布局,并允许保存自定义布局)。

2.Hierarchy窗口:Hierarchy窗口是场景中每个游戏对象的分层文本表示形式。场景中的每一项都在层级视图中有一个条目。层级视图显示了游戏对象之间相互连接的结构。

3.Scene视图:Scene视图可用于场景的编辑与呈现。根据正在处理的项目类型,Scene 视图可显示 3D 或 2D 透视图。

4.Inspector窗口:Inspector窗口可用于查看和编辑当前所选游戏对象的属性。由于不同类型的游戏对象具有不同的属性集,因此在选择不同游戏对象时,Inspector 窗口的布局和内容也会变化。

5.Project窗口:Project窗口显示可在项目中使用的资源库。将资源导入到项目中时,这些资源将显示在此处。

6.Game视图:Game视图通过场景摄像机模拟最终渲染的游戏的外观效果。单击 Play 按钮即开始模拟。

当然还有一些其他的视图布局,包括Asset Store资源商店视图、Animation动画视图、Animator动画化控制器视图、Occlusion遮挡剔除视图等,可以在Unity界面的相应位置打开这些视图。

这里再介绍一下一些工具图标的使用:
在这里插入图片描述
从上到下依次为

1.视图工具:用于在场景中拖动视野

2.调动工具:用于移动游戏对象或在Inspector窗口实现移动

3.旋转工具:用于360度地旋转游戏对象或在Inspector窗口实现对象旋转

4.缩放工具:用于放大或缩小游戏对象或在Inspector窗口实现对象缩放

5.矩形工具:允许用户查看和编辑2D或者3D游戏对象的矩形手柄

6.变换工具:快捷实现对象的变换
在这里插入图片描述
从左到右依次为

1.播放/预览游戏按钮:当单击该按钮后,Game视图会被激活,实时显示游戏运行的画面。

2.暂停播放按钮:在Game视图激活后后,单击暂停按钮后,Game视图会停止运转,当再次按下该键可以让游戏从暂停的地方继续运行。

3.逐帧播放按钮:用来逐帧预览播放的游戏,方便查找游戏存在的问题。

2.脚本生命周期

Unity三个特性:

public int a;//定义公开字段
 
[SerializeField]private int a=100;//序列化字段 作用:在编辑器中显示(编辑)私有变量

[HideInInspector]public float b;//作用:在编译器中隐藏公共字段

[Range(0, 100)]public int c;//给该变量值定义范围

脚本生命周期即必然事件\消息,是指Unity脚本从唤醒到销毁的过程。
在这里插入图片描述
这里我们着重对初始阶段、物理阶段、游戏逻辑、输入事件、场景渲染、结束阶段六个阶段进行介绍

初始阶段

Awake()唤醒

Start()开始

OnEnable()当可用

OnDisisable:在禁用脚本时调用,重新激活时将调用 OnEnable 方法

Awake 隔帧后会调用 Start,并且只会调用一次,OnEnable每次被激活时都会被调动

    private void Awake()//唤醒
    {
        //可判断当满足某种条件执行此脚本this.enable=true
        //脚本启不启用都会执行Awake
    }
    //执行时机:创建游戏对象(物体载入)-->立即-->【执行1次】
    //作用:初始化(相当于构造函数)
    private void Start(){}//开始
    //执行时机:创建游戏对象-->脚本启用-->才【执行1次】
    //作用:初始化(相当于构造函数)
    private void OnEnable(){}//当可用
    //每当脚本对象启用的时候调用

物理阶段

OnCollisionXXX碰撞: 当满足碰撞条件时调用
OnTriggerXXX触发: 当满足触发条件时调用
FixedUpdate() 固定更新

    private void FixedUpdate(){}//固定更新
    //渲染时间不固定(每帧渲染物体量不同、机器性能不同)
    //执行时机:每隔固定时间执行一次,默认0.02s(可在“Edit”–>“Project Setting”–>“Time”–>“Fixed Timestep” 修改)
    //适用性:适合对物体做物理操作(移动、旋转等),且不会受到渲染影响

游戏逻辑

Update()更新

yield :协程任务会在每一帧 Update 后,LateUpdate 之前执行。

LateUpdate()延迟更新

    private void Update()//更新
    {
        //每次渲染场景时调用,频率与设备性能及渲染量有关
    }
    //执行时机:渲染帧执行,执行间隔不固定
    //适用性:处理游戏逻辑
    private void LateUpdate()//延迟更新
    {
        //在Update函数被调用后执行,适用于跟随逻辑
    }

输入事件(OnMouseXXX,必须要加collide组件)

OnMouseEnter鼠标移入:鼠标移入到当前Collider时调用
OnMouseOver鼠标经过:鼠标经过当前Collider时调用
OnMouseExit鼠标离开:鼠标离开当前Collider时调用
OnMouseDown鼠标按下:鼠标按下当前Collider时调用
OnMouseUp鼠标抬起:鼠标在当前Collider上抬起时调用

场景渲染

OnPreCull:在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。

OnBecameVisible当可见:当MeshRenderer 在任何相机上可见时调用
OnBecameInvisible当不可见: 当MeshRenderer 在任何相机上都不可见时调用OnWillRenderObject:如果对象可见,则为每个相机调用一次此函数。
OnPreRender:在相机开始渲染场景之前调用此函数。
OnRenderObject:在完成所有常规场景渲染后调用此函数。可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。
OnPostRender:在相机完成场景渲染后调用此函数。
OnRenderImage:在完成场景渲染后调用此函数,以便对屏幕图像进行后处理(仅限专业版)。
OnDrawGizmos:用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。
OnGUI:在每帧上多次调用此函数,以响应 GUI 事件。程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard 鼠标事件。

结束阶段

OnDisable当不可用:对象变为不可用或附属游戏对象非激活状态时此函数被调用
OnDestroy当销毁:当脚本销毁或附属的游戏对象被销毁时被调用
OnApplicationQuit当程序结束:应用程序退出时被调用

3. 相关概念

Scene场景

游戏每个画面中看到的所有事物(对象)都存放在场景中,也可以把场景看作是一个用于容纳对象及子对象的箱子。

Unity常用API继承关系图

在这里插入图片描述

GameObject游戏对象

Unity 中,游戏由场景组成,而场景中的任何元素,都是游戏对象

游戏对象是 Unity 中的基础对象,表示角色、道具和景物。它们本身并没有取得多大作为,但它们充当组件的容器,而组件可实现功能。游戏对象始终附加一个变换组件(表示位置和方向),并且无法删除此组件。

只有GameObject能够New,其他所有组件都不能创建实例,如果想在代码层面添加组件,必须通过GameObject。

一些api的使用:

创建GameObject的三种方式:

// 通过构造方法
GameObject go= new GameObject("cube");
// 克隆一个已有的
GameObject.Instantiate(prefab);
// 创建基本的物体
GameObject go =GameObject.CreatePrimitive(PrimitiveType.Cube);

1.gameObject.activeInHierarchy:在场景中物体激活状态(实际状态)2.gameObject.activeSelf:物体自身激活状态,物体在面板上的激活是否有勾上3.gameObject.SetActive():设置物体的启用和禁用

Debug.Log(go.activeInHierarchy); // True
go.SetActive(false);
Debug.Log(go.activeInHierarchy); // False

4.GameObject[] e= GameObject.FindGameObjectsWithTag(“Enemy”):获取所有使用该标签的物体,并返回数组

5.GameObject player = GameObject.FindWithTag(“Player”):根据标签寻找单个物体

6.gameObject.AddComponent():添加组件

GameObject中的一些属性:

activeInHierarchy :判断物体是否是active状态,true表示是,false表示不是。

layer :游戏对象所在的图层。图层的范围为[0 … 31]。图层可用于从相机进行选择性渲染或忽略射线广播。

scene :游戏物体所属的场景。

tag :游戏物体的标签。

Component组件

组件定义了包含它们的游戏对象的行为,是每个游戏对象的功能单元。

一些api的使用:

  1. AddComponent : 将名为 className 的组件类添加到该游戏对象

    go.AddComponent<className>();
    
  2. ComPareTag : 如果游戏对象附加了类型为 type 的组件,则将其返回,否则返回 null

  3. SetActive : 激活/停用此 GameObject

  4. GetCompont:如果游戏对象附加了类型为 type 的组件,则将其返回,否则返回 null

    Cube cube = target.GetComponent<Cube>(); //返回类型为Cube的一个组件
    Transform t = target.GetComponent<Transform>();//返回类型为Transform的一个组件
    
  5. GetComponts: 返回 GameObject 中类型为 type 的所有组件

  6. GetComponentsInChildren: 使用深度首次搜索返回 GameObject 或其任何子项中类型为 type 的组件

    Cube[] cubes = target.GetComponents<Cube>();
    cubes = target.GetComponentsInChildren<Cube>();
    foreach(Cube c in cubes)
    {
     	 Debug.Log(c);
    }
    
  7. GetComponentsInParant: 返回 GameObject 或其任何父项中类型为 type 的组件

Transform变换组件

Transform 变换组件用于存储游戏对象的位置、旋转、缩放和父子化状态,因此非常重要。游戏对象始终附加一个变换组件,无法删除变换组件或创建没有变换组件的游戏对象。

变换组件的位置、旋转和缩放值是相对于变换组件的父项测量的。如果变换组件没有父项,则按照世界空间来测量属性。

Inspector 中任何子游戏对象的 Transform 值都是相对于父项 Transform 值显示的结果。这些值称为“局部坐标”。

一些api的使用:

1.Translate :使物体向某个方向移动

public void Translate(float x, float y, float z);//x轴向x方向移动,y轴向y方向移动,z轴向z方向移动
public void Translate(float x, float y, float z, Space relativeTo = Space.Self(Space.world));

2.Rotate :控制物体的旋转

public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);//xAngle、yAngle、zAngle表示各向X、y、z轴转多少角度
public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);//传递一个欧拉角,第二个参数时相对于哪个物体旋转,默认为自身
public void Rotate(Vector3 axis, float angle, Space relativeTo = Space.Self);//axis:旋转的轴 ,angle:旋转的角度
RotateAround(Vector3.zero,Vector3.up,1)//以自身坐标系为基准,绕自定义轴方向旋转1度,自定义轴需要两个点来决定,因此需要输入两个点,第四个参数同上,也有世界坐标系

3.SetParent :设置当前物体的父物体

4.SetPositionAndRotation :设置transform的位置和旋转

5.SetAsFirstSibling :将当前transform设置成列表中第一个

6.Transform Child = this.transform.Find(name):通过名字寻找获得子物体的变换组件,不能找孙子代之后的物体

7.Transform Child = this.transform.GetChild(int index):通过索引寻找获得子物体的变换组件

8.root:获得该物体的根物体

9.parent:获得该物体的父物体

10.DetachChildren:解除子对象的父子关系

11.SetParent(null):解除父对象的关系

Time类

  1. deltaTime: 完成上一帧所用的时间
  2. fixedDeltaTime:执行物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)的时间间隔
  3. fixedTime:最近一次 FixedUpdate 已启动的时间。此为自游戏启动以来的时间
  4. frameCount:已经过的总帧数
  5. realtimeSinceStartup:游戏开始以来的实际时间
  6. smoothDeltaTime:经过平滑处理的 Time.deltaTime
  7. time:该帧开始的时间。此为自游戏启动以来的时间
  8. timeScale:时间流逝的缩放。可用于慢动作效果
  9. timeSinceLevelLoad:该帧开始以来的时间。此为自加载上一个关卡以来的时间

Input类

1.GetKey() 按键一直按着时触发

2.GetKeyDown 按键被按下那一刻进行触发

3.GetKeyUp 按键被按下后抬起时触发

场景、组件与游戏对象的关系

场景 scene 包含游戏对象 game object,游戏对象 gameobject 包含组件 component,组件服务于游戏对象,可以为一个游戏对象绑定一个或多个组件,组件包括变换类(Transform)、刚体类(Rigidbody)、碰撞类(Collider)等,以实现更为完美的界面效果和程序功能。

静态游戏对象

如果游戏对象在运行时未移动,则被称为静态游戏对象。如果游戏对象在运行时移动,则被称为动态游戏对象。

Unity 中的许多系统都可以在 Editor 中预计算有关静态游戏对象的信息。由于静态游戏对象不会移动,因此这些计算的结果在运行时仍然有效。

所以,恰当地使用静态游戏对象可以节省运行时计算成本,并可能提高性能。

游戏对象 game object,游戏对象 gameobject 包含组件 component,组件服务于游戏对象,可以为一个游戏对象绑定一个或多个组件,组件包括变换类(Transform)、刚体类(Rigidbody)、碰撞类(Collider)等,以实现更为完美的界面效果和程序功能。

猜你喜欢

转载自blog.csdn.net/m0_54119099/article/details/125793236