Unity-3D-H2

ゝ一世哀愁。 2023-06-05 08:14 55阅读 0赞

1、简答题【建议做解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。

    •   游戏对象:直接出现在游戏的场景中,是资源整合的具体表现,对象通过层次结构来组织,通过整体-部分的关系构成层次结构。资源:资源通过文件夹的形式组织,包含常用的图像,视频,脚本文件,预制文件等等,可以被一个或者多个对象使用。
  • 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)

    • 资源的目录组织结构主要包含文件、材质、模型、预制件、场景、脚本、标准资源这几个部分。资源里面又包含了图片,游戏需要用到的音乐等等。游戏对象树就如同Windows的文件资源管理器一样,树目录结构:一个游戏对象(文件夹)包含多个子对象(子文件夹),子对象(子文件夹)又可以继续包含多个子对象(子文件夹)。
  • 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件

    • 基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
    • 常用事件包括 OnGUI() OnDisable() OnEnable()
    • using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;

      public class testBehavior : MonoBehaviour
      {

      1. void Start(){
      2. Debug.Log("Start");
      3. }
      4. void Awake(){
      5. Debug.Log("Awake");
      6. }
      7. void Update(){
      8. Debug.Log("Update");
      9. }
      10. void FixedUpdate(){
      11. Debug.Log("FixedUpdate");
      12. }
      13. void LateUpdate()
      14. {
      15. Debug.Log("LateUpdate");
      16. }
      17. void OnGUI(){
      18. Debug.Log("OnGUI");
      19. }
      20. void OnDisable(){
      21. Debug.Log("OnDisable");
      22. }
      23. void OnEnable(){
      24. Debug.Log("OnEnable");
      25. }

      }

        

  • 查找脚本手册,了解 GameObject,Transform,Component 对象

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

      • GameObject:是Unity场景里面所有实体的基类.
        Transform:物体的位置、旋转和缩放。
        Component:一切附加到游戏物体的基类。
    • 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件

      • 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
      • 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
      • activeSelf:修改对象的名称,动静态等属性(图中对象名称是table,动态)
        Transform:调整对象的位置、面向方向、大小(默认位置大小)
        Box Collider:调整坐标系的位置、大小
        Add Component:给对象增加行为
    • 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)

      • 1382574-20190912113318023-1062807704.png
  • 资源预设(Prefabs)与 对象克隆 (clone)
  • 预设(Prefabs)有什么好处?

    • 预设 (Prefab) 是一种资源 - 存储在工程视图 (Project View) 中可重复使用的游戏对象 (GameObject)。预设 (Prefabs) 可放入到多个场景中,且每个场景可使用多次。向场景添加一个预设 (Prefab) 时,就会创建它的一个实例。所有预设 (Prefab) 实例都链接到原始预设 (Prefab),实质上是原始预设的克隆。不管您的工程中有多少个实例,您对预设 (Prefab) 作薄出任何更改时,您会看到这些更改应用于所有实例。预设与对象
    • 克隆 (clone or copy or Instantiate of Unity Object) 关系?
    • 在Unity3D当中,为了快速复制出游戏对象,主要有克隆游戏对象与创建预制两种方法。

      两者区别在于:

      1. 1、克隆游戏对象需要场景中有被克隆对象,而创建预制只需事先创建预制即可,允许场景中一开始并不存在该游戏对象。
      2. 2、克隆出来的游戏对象并不会随着被克隆体的变化而发生变化,但是使用预制创建出来的对象会随着预制的改变而发生改变。
    • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象 将table预制体放到 Resource 文件夹下使用

      • public GameObject obj;
        void Start () {
        1. GameObject instance = (GameObject)Instantiate(obj.gameObject, transform.position, transform.rotation);
        }

2、 编程实践,小游戏

  • 游戏内容: 井字棋 或 贷款计算器 或 简单计算器 等等
  • 技术限制: 仅允许使用 IMGUI 构建 UI
  • 作业目的:

    • 了解 OnGUI() 事件,提升 debug 能力
    • 提升阅读 API 文档能力
    • using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;

      public class Chess : MonoBehaviour {

      1. private int turn = 1;
      2. private int[,] grid = new int[3, 3];
      3. // 重新开始游戏
      4. void Start () {
      5. Restart();
      6. }
      7. void Restart()
      8. {
      9. turn = 1;
      10. for (int i = 0; i < 3; ++i)
      11. {
      12. for (int j = 0; j < 3; ++j)
      13. {
      14. grid[i, j] = 0;
      15. }
      16. }
      17. }
      18. void OnGUI()
      19. {
      20. //设置button中字体的大小
      21. GUI.skin.button.fontSize = 20;
      22. //设置label中字体大小和颜色
      23. GUIStyle style = new GUIStyle();
      24. style.fontSize = 40;
      25. style.normal.textColor = new Color(255, 255, 255);
      26. //判断是否点击Restart按钮
      27. if(GUI.Button(new Rect(360, 500, 80, 80), "Restart")){
      28. Restart();
      29. }
      30. //判断游戏是否结束
      31. int result = judge();
      32. if (result == 1)
      33. {
      34. GUI.Label(new Rect(340, 170, 100, 50), "O wins!", style);
      35. }
      36. else if (result == 2)
      37. {
      38. GUI.Label(new Rect(340, 170, 100, 50), "X wins!", style);
      39. }else if (result == 3)
      40. {
      41. GUI.Label(new Rect(300, 170, 100, 50), "GameOver!", style);
      42. }
      43. //生成棋盘并判断格子是否被点击
      44. for (int i=0; i<3; i++)
      45. {
      46. for(int j=0; j<3; j++) {
      47. if (grid[i, j] == 1)
      48. {
      49. GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "O");
      50. }else if (grid[i, j] == 2)
      51. {
      52. GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "X");
      53. }else if (GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "")&&result==0)
      54. {
      55. if (turn == 1)
      56. {
      57. grid[i, j] = 1;
      58. }else
      59. {
      60. grid[i, j] = 2;
      61. }
      62. turn = -turn;
      63. }
      64. }
      65. }
      66. }
      67. int judge()
      68. {
      69. // 横向连线
      70. for (int i = 0; i < 3; ++i)
      71. {
      72. if (grid[i, 0] != 0 && grid[i, 0] == grid[i, 1] && grid[i, 1] == grid[i, 2])
      73. {
      74. return grid[i, 0];
      75. }
      76. }
      77. //纵向连线
      78. for (int j = 0; j < 3; ++j)
      79. {
      80. if (grid[0, j] != 0 && grid[0, j] == grid[1, j] && grid[1, j] == grid[2, j])
      81. {
      82. return grid[0, j];
      83. }
      84. }
      85. //斜向连线
      86. if (grid[1, 1] != 0 &&
      87. grid[0, 0] == grid[1, 1] && grid[1, 1] == grid[2, 2] ||
      88. grid[0, 2] == grid[1, 1] && grid[1, 1] == grid[2, 0])
      89. {
      90. return grid[1, 1];
      91. }
      92. //全部格子都被点击
      93. bool allClick = true;
      94. for (int i=0; i<3; i++)
      95. {
      96. for (int j=0; j<3; j++)
      97. {
      98. if (grid[i, j] == 0)
      99. {
      100. allClick = false;
      101. }
      102. }
      103. }
      104. if (allClick)
      105. return 3;
      106. return 0;
      107. }

      }

        视频链接:https://github.com/IYreality/Homework/blob/master/3-1/unity-3D/second/%E4%BA%95%E5%AD%97%E6%A3%8B%E6%BC%94%E7%A4%BA.wmv

3、思考题【选做】

  • 微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。

    • 为什么是“模板方法”模式而不是“策略模式”呢?
  • 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。

    • 尝试解释组合模式(Composite Pattern / 一种设计模式)。
    • 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
  • 一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是 GameObject 添加一组行为部件(Component)。

    • 这是什么设计模式?
    • 为什么不用继承设计特殊的游戏对象?

作业提交要求

  • 仅能用博客或在线文档提交作业,建议使用 Github 提交代码和作业。不能使用docx、pdf等需要下载阅读的格式
  • deadline 问课程 TA

转载于:https://www.cnblogs.com/AilsaEvans/p/11511101.html

发表评论

表情:
评论列表 (有 0 条评论,55人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Unity-3D-H2

    1、简答题【建议做解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。   游戏对象:直接出现在游戏的场景中,是资源整合的具体表现,对

    相关 DH图像工程师

    ![1][] 1.指针做函数返回值时, 必须返回一个处于生命周期中的变量的地址。 本题中,函数结束时str\[\]就被释放了,返回的地址也就没有什么意义了,并且还有

    相关 unity2D

    Unity2D碰撞效应 Area Effector 2D地区效应: 适用于特定区域内的定向力度 Use Collider Mask 使用碰撞遮罩。 Collider

    相关 Unity3

    注:如类有共有的构造函数而且没有使用Dependency特性,可以在不需要注册映射关系的前提下,使用容器生成实例 1、获取默认映射 IMyService resul