3D游戏编程与设计-Unity ch02

简答题

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

  • 游戏对象(GameObjects)是能容纳实际实现功能的组件,是Unity中代表人物、场景或道具的基本对象,简单来讲GameObjects也就是场景(Scene)里所有实体的基类,组成了完整的游戏场景。游戏对象只充当组件的容器但本身不做任何事情,需要被附加上特殊属性才能成为一个具体的角色、环境或效果;

  • 资源是指在Unity项目中用到的资源文件,可以是在Unity之外创建的文件也可以是在Unity中创建的资源,如3D模型、音频文件、图像、脚本渲染纹理等;

  • GameObjects与Assets的区别在于GameObjects是我们在游戏运行中真实存在的可操作的游戏对象,而Assets是创作游戏时为实现对象的修饰而添加进工作区的资源、部件,比如一个方块是游戏对象GameObject,而方块表面的图案纹理和效果等就是由附加在方块对象上的资源Assets决定的;

  • 二者的联系是Assets可以作为模板,实例化成具体的GameObject,也可以作为GameObject中的某种属性,可以被多个GameObject同时使用。也就是说资源可能并没有在游戏场景中使用,而游戏对象是游戏运行时存在可见的,包括角色、道具、灯光和摄像头等,但不包括component,即背后运行的逻辑系统(脚本),从这个层面上讲,GameObject可以认为是Assets的子集。

二、分析游戏案例

  以切水果小游戏CutFruit为分析案例:
CutFruit 截图   该CutFruit游戏的资源文件夹Assets如下图所示,采用树状结构,分为3个子文件夹:
AssetsFiles

  子文件夹Res的结构如下图所示:
Res

  子文件夹Scenes和Scripts的结构如下:
Scenes_Scripts

  可见该游戏的资源文件夹将作用相似或性质相似的资源放在同一个文件夹中,整个文件夹呈树状结构,下一级文件夹和上一级文件夹是继承关系。游戏对象文件夹的结构也与此类似,:
ObjectWorld

ObjectUI

  图中的父对象Canvas有LifeText和SourceText两个子对象,父对象GameOverImage有子对象GameOverText和RestartGameButton,而RestartGameButton对象还有自己的子对象,整个游戏对象文件夹也呈树状结构,父对象和子对象之间是继承关系,任一级别的一个父对象都由其所有的子对象组成。

三、使用debug语句验证MonoBehaviour基本行为或事件触发条件

  基本行为包括Awake(),Start(),Update(),FixedUpdate(),LateUpdate()等,常用的事件有OnGUI(),OnDisable(),OnEnable()等。使用debug语句验证某行为触发条件可采用Debug.Log("xxx");语句。编写代码如下:

using System.Collections;
using System.Collections.Generic;
using System.UnityEngine;public class testBeh : MonoBehaviour {void Awake(){Debug.Log("Awake triggered");}void Start(){Debug.Log("Start triggered");}void Update(){Debug.Log("Update triggered");}void FixedUpdate(){Debug.Log("FixedUpdate triggered");}void LateUpdate(){Debug.Log("LateUpdate triggered");}void OnGUI(){Debug.Log("OnGUI triggered");}void OnDisable(){Debug.Log("OnDisable triggered");}void OnEnable(){Debug.Log("OnEnable triggered");}
}

  运行结果如下:
runDebug

  图中MonoBehaviour基本行为或事件的触发顺序是Awake -> OnEnable -> Start -> FixedUpdate -> Update -> LateUpdate -> OnGUI -> OnDisable -> OnDestroy ,其中:

Awake用于在所有对象初始化完成后、游戏开始之前初始化变量或游戏状态且仅被调用一次;
OnEnable在启用对象后立即被调用,特殊情况是对象处于非活跃状态则不调用OnEnable;
Start在Update函数第一次被调用前调用,且仅被调用一次;
FixedUpdate是固定帧更新,通常比更新更频繁被调用,更新频率默认是0.02s;
Update是正常帧更新,用于在每一帧更新逻辑,但在处理Rigidbody时用FixedUpdate代替;
LateUpdate在所有Update函数调用后被调用,每一帧执行一次,LateUpdate开始时更新中
执行的任何计算都将完成;
OnGUI用于响应GUI事件,每帧都多次被调用,处理顺序是Layout和Repaint>每个输入事件的
布局和键盘/鼠标事件;
OnDisable在行为被禁用或不活动时被调用。

四、了解GameObject、Transform、Component对象

  1. 翻译官方对三个对象的描述

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 real functionality.*

  游戏对象是Unity中表示角色、道具和场景的基本对象。它们本身并没有完成太多工作,但它们充当组件的容器,组件实现了真正的功能。

The Transform component determines the Position, Rotation, and Scale of
each object in the scene. Every GameObject has a Transform.

  “变换”组件确定场景中每个对象的位置、旋转和缩放。每个游戏对象都有一个转换。

Components are the nuts & bolts of objects and behaviors in a game. They
are the functional pieces of every GameObject.

   组件是游戏中对象和行为的具体细节。它们是每个游戏对象的功能部件。

  1. 描述下图table对象(实体)的属性、Transform属性及部件
    table
       table的对象是GameObject,第一个选择框是activeSelf属性,后面下拉栏是isStatic属性,后面是Tag、Layer、Transform属性,Transform属性中Position和Rotation在XYZ三个坐标轴上的值均为0,Scale在XYZ三个坐标轴上的值均为1。
      其中activeSelf属性表示GameObject的本地活动状态,isStatic属性用于指定游戏对象是否为静态,Tag是游戏对象的标签,Layer属性指定游戏对象的所在图层(在[0,31]范围内),Transform属性表示附加到该GameObject上的转换。
      table的部件有Mesh Filter、Box Collider、Mesh Renderer。

  2. 用UML图描述GameObject、Transform、Component的关系
      三者的关系如图所示:
    UML

五、资源预设(Prefabs)与对象克隆(clone)

  1. 预设(Prefabs)的好处
      预设可以实例化出具有相同属性的对象,并且可以将某一对象上发生的修改同步到其他所有副本对象上,所以预设有利于资源的重用,可以有效避免多次重复构建相同的对象如NPC、道具、场景等。
  2. 预设与对象克隆(clone/copy/instantiate of Unity Object)的关系
      当利用预设来创建一个新对象时,这个对象本质上相当于由预设克隆而来的,但对象克隆产生的实例都是完全独立的个体,之间不会互相影响;而预设的所有实例是紧密绑定联系的,对预设进行修改会作用到该预设的所有实例上。
  3. 制作table预制并通过代码将其实例成游戏对象
      编写代码如下:
public class InitBeh : MonoBehaviour {public GameObject table;void Awake(){//Debug.Log("Init Awake");}//Use this for initializationvoid Start(){Debug.Log("Init Start");//将table预设实例化为游戏对象GameObject table2=(GameObject)Instantiate(table.gameObject);table2.name="newTable";table2.transform.position=new Vector3(0,UnityEngine.Random.Range(0,5),0);table2.transform.parent=this.transform;}//Update is called once per framevoid Update(){Debug.Log("Init Update");}
}

编程题

  基于IMGUI构建UI编写井字棋小游戏,完整代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class initBeh : MonoBehaviour {private int turn = 1;//记录轮到谁:turn=1为○,turn==2为×int[][] board = new int[3][] { new int[3], new int[3], new int[3] };void Start() {Debug.Log("game start");reset();}//重新开局void reset() {turn = 1;for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {board[i][j] = 0;}}Debug.Log("game reset");}//检查胜利条件int check() {//横线bingofor (int i = 0; i < 3; i++) {if (board[i][0] != 0 && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {return board[i][0];}}//纵线bingofor (int i = 0; i < 3; i++) {if (board[0][i] != 0 && board[0][i] == board[1][i] && board[1][i] == board[2][i]) {return board[0][i];}}//斜线bingoif (board[1][1] != 0 &&board[0][0]== board[1][1] && board[2][2] == board[1][1] ||board[0][2] == board[1][1] && board[2][0] == board[1][1]) {return board[1][1];}//没有人胜利 对局继续for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (board[i][j] == 0) return 0;}}//平局return 3;}//显示对局情况void display_result(int res) {int m = Screen.width / 2;if (res == 0) {GUI.Box(new Rect(m - 50, 165, 100, 35), "PLAY!");}else if (res == 1) {GUI.Box(new Rect(m - 50, 165, 100, 35), "O WIN!");}else if (res == 2) {GUI.Box(new Rect(m - 50, 165, 100, 35), "X WIN!");}else if (res == 3) {GUI.Box(new Rect(m - 50, 165, 100, 35), "平局!");}}void OnGUI() {int m = Screen.width / 2;GUI.Box(new Rect(m - 150, 130, 300, 420), "井字棋");/*如果reset被点击则重开*/if (GUI.Button(new Rect(m - 50, 500, 100, 35), new GUIContent("Reset", "点击重新开始"))) reset();GUI.Label(new Rect(m - 50, 535, 100, 35), GUI.tooltip);int res = check();for (int i = 0; i < 3; ++i) {for (int j = 0; j < 3; ++j) {if (board[i][j] == 1) {GUI.Button(new Rect(m - 150 + i * 100, 200 + j * 100, 100, 100), "O");}else if (board[i][j] == 2) {GUI.Button(new Rect(m - 150 + i * 100, 200 + j * 100, 100, 100), "X");}   if(GUI.Button(new Rect(m - 150 + i * 100, 200 + j * 100, 100, 100), "")) { if (res == 0) {if (turn == 1) {board[i][j] = turn;turn = 2;}else {board[i][j] = turn;turn = 1;}}  }}}display_result(res);}
}

  游戏过程截图如下:
tictactoe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/62062.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity游戏开发——新发教你做游戏(一):打开游戏开发新世界的大门

文章目录 一、前言二、制作思路三、提出问题四、具体实现 一、前言 嗨&#xff0c;大家好&#xff0c;我是新发&#xff0c;如下&#xff0c;我做了个简单的Demo&#xff0c;接下来我会详细介绍如何一步步制作&#xff0c;Demo工程我已上传到GitHub&#xff0c;感兴趣的同学可…

基于Unity的2d动画游戏-------------------c#开发

基于unity的2d动画制作----基于c#语言开发&#xff0c;类似于《DNF》的2d界面&#xff0c;目前只有一个游戏场景。成果图UI如下图所示 游戏成果视频已经上传B站&#xff1a; 2dAnimation游戏 游戏开发主要步骤&#xff1a; 1.素材收集&#xff08;来自Unity的Asset Store&…

【项目展示】基于Unity开发的3DRPG游戏

介绍 项目为大四毕业设计的游戏内容部分&#xff0c;使用Unity3D开发&#xff0c;总代码6000行&#xff0c;全部为自己实现&#xff0c;主要是一套简单的代码框架&#xff0c;具备一定的扩展性。游戏中填充了第一关的内容以展示功能。&#xff08;仍然有许多改进空间&#xff…

【游戏开发】2D RPG游戏

前言 通过对游戏《原神》的功能复刻来学习游戏开发 截止到10月&#xff0c;本项目已经开发的差不多了&#xff0c;不是开发的完善了&#xff0c;而是通过这个项目已经学会了Unity开发游戏的技巧&#xff0c;就不继续开发了。 这里展示一下目前的成果&#xff0c;并简述一下各…

Unity 3D 游戏与编程

3D 游戏与编程——作业二 1、简答题 1&#xff09;解释 游戏对象&#xff08;GameObject&#xff09;和 资源&#xff08;Assets&#xff09;的区别和联系 Assets 是游戏中具体的资源&#xff0c;比如 texture&#xff0c;mesh&#xff0c;material&#xff0c;shader&#x…

unity3d开发微信小游戏2

文章目录 前言一、开发的一些记录二、最终截图总结 前言 最开使用unity3d开发微信小游戏&#xff0c;遇到了一些问题&#xff0c;记录一下&#xff0c; 同时创建了一个交流群QQ 641029627&#xff0c;现在应该没人&#xff0c;有需要的可以加入一起讨论&#xff0c;广告哥远离…

Unity简单2D游戏开发

Unity简单2D游戏开发 前言&#xff1a; 近日比较无聊&#xff0c;在b站找了一个up主&#xff0c;跟着他的教程来做游戏——开发一个简单的2D游戏 用 Tilemap 绘制场景 新建一个2D项目&#xff0c;在Unity Asset Store中搜索下载 “Pixel Adventure ”&#xff0c;第一个就是…

Unity 开发微信小游戏初探

前言 最近因项目需要开始研究Unity开发微信小游戏相关的知识。期间遇到各种坑&#xff0c;网上查阅的资料基本类似&#xff0c;无法解决自己遇到的问题。特用本文记录下过程&#xff0c;方便其他人遇到同样的问题时能够参考。 开发环境 Unity 版本 根据微信小游戏插件文档推荐…

UNITY3D对接QQGame(PC)开发教程(2022)

效果 目标&#xff1a;能在UNITY3D里通过qqgame充值 因为目前还没有这类文章&#xff0c;所以填补这下块空白 文章包含 QQGame登录器的制作 QQGAME和UNITY3D的交互 QQGame平台用户信息的读取 支付规则&#xff0c;后台搭建。 和常见问题。 对接参考腾讯开发者有文档 https:/…

《Unity 2D与3D手机游戏开发实战》上架了。

新书上架了。 这本书主要是Unity开发的入门&#xff0c;附带了一个简单的2D例子&#xff0c;一个3D RPG的简单例子和一个尽可能用插件实现的射击游戏的例子。 书很薄&#xff0c;不过因为是彩页印刷&#xff0c;价钱不是那么实惠。不过说实话&#xff0c;因为这类书里面有很多…

Unity游戏开发 3D RPG(1-4)

如何将普通的3D项目升级到URP 在Package Manner 里的Unity Registry 里搜索 Universal RP ( 通用渲染管线Universal Render Pileline). 随后在Assets 新建Rendering ——URP Assets (with Universal Renderer) Edit -project setting -graphics,在Render pileline setting里…

Unity游戏开发:对话系统的实现

在解谜类游戏中&#xff0c;与npc的对话是一个基础且常用的功能。通常来说&#xff0c;在与npc的对话中玩家可以获取一些有价值的信息并对之后的游戏有一定的导向作用。此外&#xff0c;在玩家获取对应物品前后&#xff0c;与npc的对话内容也会发生相应改变。因此&#xff0c;我…

王小川大模型25天再升级!13B版本开源免费可商用,3090即可部署

衡宇 金磊 发自 凹非寺量子位 | 公众号 QbitAI 就在刚刚&#xff0c;王小川的开源大模型又有了新动作—— 百川智能&#xff0c;正式发布130亿参数通用大语言模型&#xff08;Baichuan-13B-Base&#xff09;。 并且官方对此的评价是&#xff1a; 性能最强的中英文百亿参数量开源…

苹果手机免越狱群控电脑端控制手机

据小编了解 &#xff0c;手机群控这个词一直受网上争议&#xff0c;那么今天小编也在这讨论一下&#xff0c;其实群控系统分很多&#xff0c;市面上有主板机群控&#xff0c;所谓的主板机群控系统是指把手机的主板全部集中到一个机箱控制&#xff0c;但这个就会留下很多弊端&am…

人工智能是否会取代人类的工作岗位?

跨国投资银行高盛预测&#xff0c;人工智能将取代3亿个全职工作岗位。依据是人工智能可以创造出与人类创建的内容无法区分的高水准内容。同一时期&#xff0c;IBM首席执行官阿文德克里希纳以人工智能聊天机器人可以取代7,800名员工为由停止了招聘。IBM并不是唯一一家“毫不犹豫…

第一位计算机科学博士诞生 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 2 月 9 日&#xff0c;在中国&#xff0c;今天是道家学派创始人老子的诞辰和清代著名女词人顾太清的生日&#xff1b;在日本&#xff0c;写出《我是猫》的知名作…

用 100 行代码揭开 LLM 集成工具 LangChain 的神秘之处!

整理 | 王子彧 责编 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; LangChain 是一个强大的程序框架&#xff0c;它允许用户围绕大型语言模型快速构建应用程序和管道。它直接与 OpenAI 的 GPT-3 和 GPT-3.5 模型以及 Hugging Face 的开源替代品&…

The missing quarter of a million 消失的25万 | 经济学人20230311版社论高质量双语精翻

文 / 柳下婴&#xff08;微信公众号&#xff1a;王不留&#xff09; 本期我们选择的是3月11日《经济学人》周报封面文章&#xff0c;即社论区&#xff08;Leaders&#xff09;的首篇文章&#xff1a;《25万英国人消失之谜》&#xff08;“The missing quarter of a million”&a…

哈佛计算机系王牌项目,要请AI来当导师了

克雷西 发自 凹非寺量子位 | 公众号 QbitAI 近日&#xff0c;哈佛宣布了一个重磅决定&#xff1a;AI导师将进入课程。 负责的还是计算机系的旗舰项目——计算机科学导论&#xff0c;也就是著名的CS50。 借助机器人导师&#xff0c;哈佛的CS50项目将拥有1:1的师生比。 这一消息是…

哈佛计算机系王牌项目,要请AI来当导师了!

来源 | 量子位 作者 | 克雷西 近日&#xff0c;哈佛宣布了一个重磅决定&#xff1a;AI导师将进入课程。负责的还是计算机系的旗舰项目——计算机科学导论&#xff0c;也就是著名的CS50。借助机器人导师&#xff0c;哈佛的CS50项目将拥有1:1的师生比。 这一消息是CS50项目导师Da…