Unity3D课程 第一次作业

Unity 3D Homework 1

简答题

  • 解释游戏对象(GameObjects)和资源(Assets)的区别与联系。
      答:对象是指直接出现在游戏场景中,玩家能看到或者听到的事物,是组成游戏场景的基本部分,是资源整合的具体表现。玩家、敌人、NPC、物理环境的组成物件等都是对象。
          资源是对象的修饰部件,可重复使用。有些资源可作为模板,实例化成游戏中具体的对象,资源可用于修改游戏场景和游戏对象属性。资源文件夹通常有Materials(材质)、Perfabs(预制体)、Scenes(场景)、Scripts(脚本)、Sounds(音频)、Vedio、Textures(贴图)等。

  • 下载几个游戏案例,分别总结资源、对象组织的结构
      答:这里以Unity2017版的样例项目Car.unity为例,进行分析和总结。首先,对于资源,文件夹采用树型结构,将类别相同(相似)或者作用相近的资源放到同一个文件夹中,再在子文件夹中根据具体的作用进行细分。在此样例中,资源分为SampleScenes和StandardAssets两个文件夹,在文件夹内又进行细分,如StandardAsserts中还分为Effects、Environment、Vehicles等,然后在子文件夹内用继续细分,直到不可再分为止。
      对于对象,也是采用树型结构来组织,每一个完整地个体作为最终的父对象,而最原始的组成结构(cube、Sphere等)作为最终的子对象。以样例项目中的Car对象为例,以Car为父对象,子对象中有Colliders、WheelsHubs等,而WheelsHubs下再有WheelHubFrontRight等来组成。

  • 编写一个代码,使用debug语句来验证MonoBehaviour基本行为或事件触发的条件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BehaviourTest : MonoBehaviour {
    private void Awake()
    {
        Debug.Log("Awake!");
    }
    // Use this for initialization
    void Start () {
        Debug.Log("Start");
    }   
    // Update is called once per frame
    void Update () {
        Debug.Log("Update");
    }
    private void FixedUpdate()
    {
        Debug.Log("FixedUpdate");
    }
    private void LateUpdate()
    {
        Debug.Log("LateUpdate");
    }
    private void OnGUI()
    {
        Debug.Log("OnGUI");
    }
    private void OnDisable()
    {
        Debug.Log("OnDisable");
    }
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }
}
  • 查找脚本手册,了解GameObject,Transform,Component对象
      答:
    GameObject:Unity场景中所有实体的基本类。
    Transform:一个对象的位置、旋转和比例。场景中的每一个对象都有Transform组件,用来保存和操作对象的位置、旋转度和比例。每一个Transform都可以拥有一个父类,可以通过分层体系来更改位置、旋转和比例。
    Component:任何与GameObject联系起来的东西的基本类。你的代码不能直接创建一个Component。但是,你可以通过写脚本代码,然后将代码绑定到GameObject上。
    这里写图片描述
    上图中,table的属性有:activelnHierarchy、activeSelf、isStatic、layer、scene、tag、transform;
    对于table的transform属性,从图中可以看到,它的localPosition的三个轴向值均为0,Rotation的三个轴向值也为0,而它的Scale属性三个轴向值均为1。
    table的组件有Transform、Mesh Filter、Box Collider、Mesh Renderer和Materials。
    三者的关系如下图:
    这里写图片描述
  • 整理相关学习资料,编写简单代码验证以下技术的实现:
    查找对象:
        通过对象名称:static GameObject Find(string name)
        通过标签获取单个游戏对象:static GameObject FindWithTag (string tag)
        获取多个对象(标签):static GameObject[] FindGameObjectsWithTag(string tag)
        通过类型获取单个对象:static Object FindObjectOfType(Type type)
        获取多个对象(类型):static Object FindObjectsOfType(Type type)
    添加子对象:public static GameObect CreatePrimitive(PrimitiveTypetype)
    遍历对象树:
List lst = new List;
foreach (Transform child in transform)
{
    lst.Add(child); 
    Debug.Log(child.gameObject.name);
}

清除所有子对象:

foreach(Transform child in transform) 
{
    Destroy(child.gameObject);
}
  • 资源预设(Perfabs)与对象克隆(clone):预设有什么好处?预设与对象克隆关系?
      答:资源预设能够完整地储存编辑好的对象及其组件和属性,若再需要创建此对象,可直接将预设当做模板,快速将对象创建出来,总之,资源预设使得资源可以重用。当利用预设创建一个新的对象时,新的对象类似于克隆出来的,不同的是,实例化出来的对象与预设之间具有关联性,当改变预设的属性时,可将所有由预设实例出来的对象的属性都改变。而克隆出来的对象和本体之间不会互相影响,各自独立。
  • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class clone : MonoBehaviour {
    Transform table;
    // Use this for initialization
    void Start () {
        table = gameObject.GetComponent<Transform>();
        GameObject anotherTable = (GameObject)Instantiate(table.gameObject);
        anotherTable.transform.position = new Vector3(0, 3, 0);
        anotherTable.transform.parent = this.transform;
    }

    // Update is called once per frame
    void Update () {    
    }
}
  • 尝试解释组合模式(Composite Pattern / 一种设计模式)。使用BroadcastMessage() 方法向子对象发送消息
      答:组合模式,又称之为“部分-整体”模式,属于对象结构型模式。其定义为:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一的对待单个对象和组合对象。组合模式中包含三种角色:Component(抽象构件)、Leaf(叶子构件)、Composite(容器构件)
    父对象:
public class Father : MonoBehaviour {
    void test()
    {
        Debug.Log("Hello, my son!");
    }
    // Use this for initialization
    void Start () {
        this.BroadcastMessage("test");
    }
}

子对象:

public class Child : MonoBehaviour {
    void test()
    {
        Debug.Log("Hello, father");
    }
    // Use this for initialization
    void Start () {

    }
}

运行结果:
这里写图片描述


此博客为本人3D游戏编程课程的作业,有不正确的地方,请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值