3D_Homework1

3D Homework1

一、简答题

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

游戏中出现的任何对象实例均为游戏对象,比如人、桌子等游戏中的实物。而资源则是游戏存储在硬盘中的文件,如图片、视频、音频、脚本等。
游戏对象描述了具体的资源实例,资源文件中可包含一个或多个游戏对象。

2.下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
案例一:Roll-a-ball
  • 资源的目录组织结构:根目录下有README、游戏目录和游戏有关素材目录。素材目录下则有游戏图标和版本信息等文件。游戏目录下则有unity编辑文件、Script文件夹、Prefabs文件夹和Materials文件夹,Prefabs中包含了预制对象,Materials中则存放了一些游戏对象的图片样式,Script文件夹中存放了与游戏逻辑业务相关的C#代码。
  • 游戏对象树的层次结构:光源、地面、操控对象、摄像机、墙和食物等游戏对象处于同一层次,均为第一层。而墙的游戏对象中又包含东、南、西、北四面不同的墙。同样,食物游戏对象中又有12个不同的子对象。
案例二:SpaceShooter
  • 资源的目录组织结构:与案例一相似,根目录下只是多了Audio、Models等文件夹来存放不同类型的素材。除此之外,在游戏目录里,有两个unity文件。其他文件夹所存放文件类型与案例一中的游戏相同。
  • 游戏对象树的层次结构:这个游戏的游戏对象主要有Background、Game-controller、Boundary、石头、飞机等,其中预制的石头、飞机等游戏对象需多次调用。
3.编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件。

代码:

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

public class hello : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Debug.Log("Start");
    }

    private void Awake()
    {
        Debug.Log("Awake");
    }

    // Update is called once per frame
    void Update () {
        Debug.Log("hello world");
    }
}

运行结果:
    Awake:程序一开始调用一次
    Start:Awake之后调用一次
    Update:每一帧被调用一次

4.查找脚本手册,了解 GameObject,Transform,Component 对象。
a) 分别翻译官方对三个对象的描述(Description)

GameObject:
从角色和收藏品到光线、摄像头和其他的物品,游戏中的每个物体都是一个游戏对象。

Transform:
Transform决定了视图中每一个物体的位置、旋转和缩放。每个游戏对象都有一个Transform。

Component:
Component是一个游戏中对象和行为的组件,它们是每个游戏对象的基本元素。

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

属性:一个游戏对象的属性由多个Component部件组成。

Transform属性:位置属性(在坐标原点处)、旋转属性(未设置旋转)、缩放属性(为大小为1的立方体)

Component:部件列表中的cube代表的是此游戏对象的形状是立方体。box-collider则设置了游戏对象的碰撞属性,碰撞的中心点设为了坐标原点,碰撞的有效体积则设为1。Mesh-Renderer表示游戏对象的网格渲染。

c) 用 UML 图描述 三者的关系。

这里写图片描述

5.整理相关学习资料,编写简单代码验证以下技术的实现:
查找对象:
void Start () {
var obj = GameObject.Find("Chair");
if(obj != null)
    Debug.Log("Find seccessed!");
else
    Debug.Log("Find failed!");
}

结果输出为“Find seccessed!”,查找成功。

添加子对象:
void Start () {
    print("hello");
    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube.name = "a cube";
    cube.transform.position = new Vector3(0, Random.Range(0, 5), 0);
    cube.transform.parent = this.transform;
}

结果在“init”对象下生成了“a cube”子对象。

遍历对象树:
void Start () {
    object[] gameObjects;
    gameObjects = GameObject.FindObjectsOfType(typeof(Transform));
    foreach (Transform iter in gameObjects)
        Debug.Log(iter.name);
}

结果输出了游戏中所有对象的名字。

删除所有子对象:
void Start () {
    for (int i = 0; i < transform.childCount; i++)
        Destroy(transform.GetChild(i).gameObject);
}

结果“init”对象中的两个“sub”子对象均被删除。

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

a) 预制的好处:
1. 可以快速、方便的创建大量可以重复使用的资源。
2. 可以在程序运行时来执行实例化操作,可以提高程序运行效率和节省内存空间。

b) 预制与对象克隆关系:
1. 相同点:两者均可以用于对象的复制相同的游戏对象。
2. 不同点:预制可以快速进行批量复制对象,但对象克隆往往用来复制少量的对象。

c) 预制实例化:

void Start () {
    GameObject contain = GameObject.Find("init");
    GameObject obj = (GameObject)Resources.Load("tb");
    GameObject pre_table = Instantiate(obj);
    pre_table.transform.position = new Vector3(0, Random.Range(5, 7), 0);
    pre_table.transform.parent = contain.transform;
}

结果在原来的table上方出现了一个一摸一样的table。

7.尝试解释组合模式(Composite Pattern / 一种设计模式)。

Composite Pattern:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

BroadcastMessage() 方法向子对象发送信息:
父对象代码:

this.BroadcastMessage("sendFromInit", "Zhuangwz is handsome!");

子对象代码:

public void sendFromInit(string s){
    Debug.Log(s);
}

输出结果为(“Zhuangwz is handsome!”)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值