Unity学习记录——离散仿真引擎基础

前言


​ 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业2

简答题


1. 游戏对象 (GameObjects) 和 资源 (Assets) 的区别与联系

ans:

​ 在unity官网之中我们可以找到如下两个定义:

Assets:
A Unity asset is an item that you can use in your game or Project. An asset may come from a file created outside of Unity, such as a 3D model, an audio file, an image, or any of the other types of file that Unity supports. There are also some asset types that you can create within Unity, such as an Animator Controller, an Audio Mixer or a Render Texture.1

GameObject:
GameObjects are the fundamental objects in Unity that represent characters, props and scenery. They do not accomplish much in themselves but they act as containers for Components, which implement the functionality.2

​ 由以上的定义,可以了解到:

​ 资源是在游戏中可以使用的各种素材,而游戏对象则是指在游戏中容纳素材并发挥其作用的基本对象。可见,二者之间的区别与联系在于:游戏对象在游戏之中并不承担实现各种属性与功能的职责,它仅仅是一个整合了各种素材的基本对象;而游戏中各种属性与功能,都是要依靠依附在游戏对象之上的资源来实现。在一定意义上,可以理解为游戏对象即为数个实例化资源。

2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)

ans:

​ 此处下载了官方教程的UnityPlayGround3

​ 资源的目录组织结如下图所示:

资源目录组织结构

​ 游戏对象树如下图所示:

游戏对象树

​ 通过简单的游戏实例,可以得出:

​ 资源组织结构包括了本项目之中的所有素材,包括Font(字体文件),Prefabs(预设),Resources(动态加载的资源文件),Materials(材质文件),Scripts(脚本代码文件)等等。这些素材文件按照所属的功能被分类放进不同文件夹。

​ 对象组织的结构则包括了所设计的游戏实例之中的所有素材,素材之间则是以继承关系存储。

3. 编写一个代码,使用debug语句来验证MonoBehaviour基本行为或事件触发的条件
  • 基本行为包括Awake() Start() Update() FixedUpdate() LateUpdate()

  • 常用事件包括OnGUI() OnDisable() OnEnable()

ans:

​ 代码如下:

void Awake()
{
    Debug.Log("Awake");
}
void Start()
{
    Debug.Log("Start");
}
void Update()
{
    Debug.Log("Update");
}
void FixedUpdate()
{
    Debug.Log("FixedUpdate");
}
void LateUpdate()
{
    Debug.Log("LateUpdate");
}
void OnGUI()
{
    Debug.Log("onGUI");
}
void OnDisable()
{
    Debug.Log("onDisable");
}
void OnEnable()
{
    Debug.Log("onEnable");
}

​ 运行之后可以看到:

运行效果

在unity官方手册事件函数的执行顺序4之中,可以看到unity脚本自带函数执行顺序以及其触发条件如下:

执行顺序:Awake ->OnEable-> Start -> FixedUpdate-> Update -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy

Awake:始终在任何 Start 函数之前并在实例化预制件之后调用此函数。(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。)

Start:仅当启用脚本实例后,才会在第一次帧更新之前调用 Start。

Update:每帧调用一次 Update。这是用于帧更新的主要函数。

FixedUpdate:调用 FixedUpdate 的频度常常超过 Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。在 FixedUpdate 之后将立即进行所有物理计算和更新。在 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为 FixedUpdate 的调用基于可靠的计时器(独立于帧率)。

LateUpdate:每帧调用一次 LateUpdate(在Update完成后)。LateUpdate 开始时,在 Update 中执行的所有计算便已完成。LateUpdate 的常见用途是跟随第三人称摄像机。如果在 Update 内让角色移动和转向,可以在 LateUpdate 中执行所有摄像机移动和旋转计算。这样可以确保角色在摄像机跟踪其位置之前已完全移动。

OnGUI:每帧调用多次以响应 GUI 事件。首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。

OnDisable:行为被禁用或处于非活动状态时,调用此函数。

OnEnable:(仅在对象处于激活状态时调用)在启用对象后立即调用此函数。在创建 MonoBehaviour 实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用

4. 查找脚本手册,了解GameObject,Transform,Component对象
  • 分别翻译官方对三个对象的描述(Description)
  • 描述table对象(实体)的属性、table的Transform属性、table的部件
  • 用UML图描述三者的关系

ans

  • 三个对象的在脚本手册之中的官方描述,以及笔者的翻译如下:

    GameObject: Base class for all entities in Unity Scenes.5

    ​ GameObject即为Unity场景之中所有实体类的基类。

    Transform: Position, rotation and scale of an object.6

    ​ Transform即为对象的位置、旋转和缩放属性值。

    Component: Base class for everything attached to GameObjects.7

    ​ Component即为附加到GameObjects上的所有对象的基类。

  • Table的对象是GameObject,其属性如下:

第一行第一个选择框为activeSelf 属性,第二个文本框是对象名称,第三个选择框为static属性。第二行有Tag属性和Layer属性,第三行为prefabs(预设)属性。

Table属性

Table的Transform属性包括:position(位置),Rotation(旋转),Scale(比例)。

Table的Transform属性

Table的部件包括:Transform,Cube(Mesh Filter),Mesh Renderer,Box Collider

Table的部件

  • GameObject,Transform,Component对象三者的关系如下:

UML图

5. 资源预设(Prefabs)与对象克隆(clone)
  • 预设(Prefabs)有什么好处?
  • 预设与对象克隆(clone or copy or Instantiate of Unity Object)关系?
  • 制作table预制,写一段代码将table预制资源实例化成游戏对象

ans

  • Unity中的预设有如下两点好处:

    1)模板功能:预设(Prefab)可以允许我们创建基于某个游戏对象的模板,通过这个模板我们可以非常方便快捷的反复创建具有相同结构的游戏对象。

    2)一变百变:当场景中存在多个相同预设创建的游戏对象时,想改变它们的某一个属性只需要改变预设的相应属性就可以了。

  • 预设和克隆都是通过复制产生游戏对象,而克隆需要当前场景已经存在游戏对象,预设设置好之后不需要有相应游戏对象;除此之外,克隆产生的游戏对象是相互独立的,可以任意修改其中的某一个对象,而如果修改预设则会导致所有对象改变。

  • 代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoadBeh : MonoBehaviour
{
    public Transform res;

    // Start is called before the first frame update
    void Start()
    {
        GameObject newobj =
            Instantiate<Transform>(res, this.transform).gameObject;
        newobj.transform.position = new Vector3(0, Random.Range(-5, 5), 0);
    }

    // Update is called once per frame
    void Update()
    {
    }
}

编程实践——计算器


计算器代码已经上传至hw2/Calculator.cs · XiaoChen04_3/3D_Computer_Game_Programming

演示:

演示效果

引用


  1. Unity - Manual: GameObjects (unity3d.com) ↩︎

  2. Unity - What is a Unity Asset? ↩︎

  3. Unity Playground | 视频教程项目资源 | Unity Asset Store ↩︎

  4. 事件函数的执行顺序 - Unity 手册 (unity3d.com) ↩︎

  5. Unity - Scripting API: GameObject (unity3d.com) ↩︎

  6. Unity - Scripting API: Transform (unity3d.com) ↩︎

  7. Unity - Scripting API: Component (unity3d.com) ↩︎

猜你喜欢

转载自blog.csdn.net/jmpei32534/article/details/127000212