Unity3d 离散仿真引擎基础

本文介绍了Unity3d中的游戏对象、资源的区别与联系,资源的目录组织结构,游戏对象树的层次结构,以及MonoBehaviour的基本行为和事件触发条件。详细讨论了GameObject、Transform和Component对象,包括它们的属性和功能。此外,还阐述了预设(Prefabs)的作用和对象克隆的差异,并提供了相关学习资料和简单代码示例。
摘要由CSDN通过智能技术生成

Unity3d 游戏——离散仿真引擎基础简答题

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

  • 游戏对象 (GameObjects) 用来表示游戏中具体的角色,道具和场景。它们通过容纳组件 (Component) 来实现实际的功能。这些附属于游戏对象的组件能给游戏对象加上所需要的属性和功能。
  • 资源 (Assets) 游戏中可能用到的模型、声音、贴图、脚本文件等等,它们不是具体的游戏物体,但可以供多个游戏对象使用。
  • 区别和联系 对象一般是一些资源的集合体,是资源整合的具体表现,并且同一个资源能被多个游戏对象使用。另外,一个设计好的对象可以成为模板从而成为一个资源。

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

  • 游戏对象树:主要包括摄像机,场景,游戏开始,进行,结束的设计,以及文本。

    Main Camera

    Canvas

    • StartView
      • Title
      • Start
        • Text
      • Exit
        • Text
      • logo
    • Load
      • Text
    • Game
      • background
      • EnemyCount
      • HP
      • GameTime
    • Over
      • Text
      • Rese
        • Text
      • Exit
        • Text

    EventSystem

    BoomAudio

  • 资源目录组织结构:主要包括动画,声音,场景,素材,模型,预设,脚本等。

    Animation

    • bom_0.controller
    • BoomAudio.controller
    • PlayerDeath.anim
    • ……

    Audio

    • backgound.wav
    • Boom.wav
    • Fire.wav
    • Load.wav
    • Loss.wav

    Object

    • Bomb.prefab
    • Door.prefab
    • Enemy.prefab
    • Enemy2.prefab
    • fire.prefab
    • Player.prefab
    • SuperWall.prefab
    • wall.prefab

    Scence

    • MainScene.unity

    Script

    • Bomb.cs
    • Boom.cs
    • BuilderPorps.cs
    • DoorWall.cs
    • EnermyAI.cs
    • FollowPlayer.cs
    • GameController.cs
    • MapController.cs
    • PlayerController.cs
    • UIController.cs

    Sprite

    • 42.png
    • Door.png
    • enemy1.png
    • logo.png
    • wall4.png
    • wall12.png
    • yaogan.png

3. 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件。

  • 基本行为包括 Awake(), Start(), Update(), FixedUpdate(), LateUpdate();

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

  • 代码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class DebugBeh : MonoBehaviour
    {
        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 OnDestroy() {
            Debug.Log("OnDestroy");
        }
    }
  • 截图
    在这里插入图片描述
    在这里插入图片描述

  • 分析

    • Awake: 当一个脚本实例被载入时被调用,或者脚本构造时调用;
    • Start: 当前脚本第一次执行update函数之前被调用一次;
    • FixedUpdate: 每固定帧绘制时执行一次,由物理引擎调用,和Update不同的是FixedUpdate是渲染帧执行,当渲染帧效率低下时,其调用次数会下降;
    • Update: 在所有脚本Start调用完后,在每一帧被调用一次;
    • LastUpdate: 在所有Update执行完后执行。
    • OnGUI: 渲染和处理GUI后调用;
    • OnEnable: 当对象变为可用或被激活时被调用;
    • OnDisable: 当对象变为不可用或非激活状态时被调用;
    • OnDestroy: 物体从场景中被销毁时以及游戏结束时执行。
  • 从控制台信息可以看出,执行顺序为 Awake -> Start -> FixedUpdate -> Update -> LastUpdate -> OnGUI 。


4. 查找脚本手册,了解 GameObject,Transform,Component 对象。

4.1 分别翻译官方对三个对象的描述(Description)

  • 以下描述摘自Unity - Scripting API

  • GameObject

    Base class for all entities in Unity Scenes.

    GameObject 是Unity场景中所有实体的基类。
    
  • Transform

    Position, rotation and scale of an object.

    一个物体的位置,旋转和大小。
    
  • Component

    Base class for everything attached to GameObjects.

    一切附加到游戏物体的基类。
    

4.2 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件 。

  • ActiveSelf (API: GameObject.activeSelf)属性,可以定义对象的名称,动静态,其中 Tag 属性用于区分游戏中不同类型的对象,可用 GameObject.FindWithTag()来查询对象。
  • Transform属性,可以定义对象的位置 (Position),方向 (Rotation),大小 (Scale)。API: Transform.position, Transform.rotation, Transform.localScale。
  • 其他 Component(包括Mesh Filter, Mesh Renderer, Default-Material)。

4.3 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
在这里插入图片描述


5. 整理相关学习资料,编写简单代码验证以下技术的实现:

  • 查找对象

    • 通过名字查找 public static GameObject Find(string name)
    • 通过标签查找单个对象 public static GameObject FindWithTag(string tag)
    • 通过标签查找多个对象 public static GameObject[] FindGameObjectsWithTag(string tag)
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class FindBeh : MonoBehaviour
    {
        public GameObject table, player;
        public GameObject[] list1;
        void Start() {
            table = GameObject.Find("table");
            player = GameObject.FindWithTag("Player");
            list1 = GameObject.FindGameObjectsWithTag("Controller");
            Debug.Log(table);
            Debug.Log(player);
            Debug.Log(list1);
        }
    }
    • 截图
      在这里插入图片描述
      在这里插入图片描述
  • 添加子对象

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class InitBeh_another : MonoBehaviour
    {
        void Start() {
            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            cube.name = "cube";
            cube.transform.position = new Vector3(0, 1, 2.8f);
        }
    }

    在这里插入图片描述
    在这里插入图片描述

  • 遍历对象树

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraBeh : MonoBehaviour
    {
        void Start() {
            foreach (Transform child in transform) {
                Debug.Log(child.name);
            }
        }
    }

    在这里插入图片描述
    在这里插入图片描述

  • 清除所有子对象

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraBeh : MonoBehaviour
    {
        void Start() {
            foreach (Transform child in transform) {
                Destroy(child.gameObject);
            }
        }
    }

    在这里插入图片描述
    在这里插入图片描述


6. 资源预设(Prefabs)与 对象克隆 (clone)

6.1 预设(Prefabs)有什么好处?

  • 预设可以提前将设计游戏中所需要的游戏对象设计打包,成为一个资源,在游戏中,可直接加载预设就能快速生成游戏对象。设计时,修改预设就可以完成对生成对象的修改。预设的存在,方便了面向对象思想的应用。

6.2 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?

  • 预设与克隆都能创建出与源对象相同的对象。由预设得到的对象与的源预设有关联,预设改变,对象跟着改变;而克隆得到的对象和源对象是独立互不影响的。

  • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class InitBeh_3 : MonoBehaviour
    {
        public Object table;
        void Start()
        {
            Debug.Log("Init Start");
            table = Resources.Load("table");
            GameObject anotherTable = (GameObject)Instantiate(table) as GameObject;
            anotherTable.transform.position = new Vector3(0, Random.Range(5, 7), 0);
            anotherTable.transform.parent = this.transform;
        }
    }

    在这里插入图片描述
    在这里插入图片描述


Unity3d 井字棋小游戏见 https://github.com/LeoBarwoo/Unity3d/tree/master/1.井字棋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值