3d游戏编程与设计

2023-11-15

1、简答题

解释游戏对象(object)和资源(asset)的区别和联系

  游戏对象是一个实体,能够承载其他游戏资源,是资源整合的具体表现。资源包含对象,除此之外,还有材质、场景、声音、贴图、脚本等,是能被游戏使用的任何东西。

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

config:游戏配置

event:游戏事件

font:游戏字体

gameSequence:游戏序列

movie:游戏的视频文件

sound:游戏语音

sound_jp:游戏日语语音

title:游戏目录
在这里插入图片描述

  具体而言就是asset目录下包含了很多游戏资源,包括字体,事件,脚本,语音,视频等

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

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

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


using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{


    void Start()
    {

        Debug.Log("Starting...");

    }

    void Update()
    {

        Debug.Log("Updating...");

    }

    void Awake()
    {

        Debug.Log("Awaking...");

    }

    void FixedUpdate()
    {

        Debug.Log("FixedUpdating...");

    }

    void LateUpdate()
    {

        Debug.Log("LateUpdating...");

    }

    void OnGUI()
    {

        Debug.Log("In OnGUI");

    }

    void OnDisable()
    {

        Debug.Log("In OnDisable");

    }

    void OnEnable()
    {

        Debug.Log("In OnEnable");

    }

}

结果如下:
在这里插入图片描述

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

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

  GameObject:统一场景中所有实体的基类。
  Tansform:物体的位置、旋转和比例。场景中的每个对象都有一个变换。它用于存储和操作对象的位置、旋转和缩放。每个变换都可以有一个父级,这允许您按层次应用位置、旋转和缩放。这是层次结构窗格中显示的层次结构。
  Component:所有附加到游戏对象的基类。请注意,您的代码永远不会直接创建Component。而是编写脚本代码,并将脚本附加到游戏对象。

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

  本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
  例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。

table的属性table属性

如图,第一个是Tag,指游戏实体的标签,用于高效查找游戏实体,第一个选择框对应CompareTag()方法。第二个是Layer,对应游戏实体所在的层,unity有8个层。

Transform属性
在这里插入图片描述

如图,第一个是position,表示该游戏实体和原点的相对位置;第二个是rotation,是表示旋转的变量;第三个是大小,表示游戏实体的相对大小。

其他Conponent
在这里插入图片描述

如图,还有四个conponent:
  Mesh Filter,网格过滤器从资源中获取网格并将其传递到网格渲染器以在屏幕上渲染。
  Mesh Renderer:网格渲染器从网格过滤器中获取几何图形,并将其渲染到GameObject的变换组件定义的位置。
  Box Collider:盒形的原始对撞机。
  Material:这个类公开材质的所有属性,允许您设置它们的动画。也可以使用它来设置无法通过检查器访问的自定义着色器属性(例如矩阵)。

  • 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
    uml

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

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

如果我们每次都从基础游戏对象构建游戏,这需要很多代码,而且不易于修改。我们可以把基本的游戏对象组合起来,制作成预制,以后把预制当作一个游戏对象使用。预设可以看成游戏资源的模板,而且预设是相互关联的,当对预设进行更改时,这些更改将会作用于与之相连的所有实例。

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

行为相似,但是只有预设有关联性,即在修改预设时,与之相关所有实例会跟着修改。克隆则不会。

  • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoadBeh : MonoBehaviour
{
    public GameObject prefab;
    void Start()
    {
        Instantiate(prefab, new Vector3(0f, 0f, 0f), Quaternion.identity);
    }
}

注意要将预制的table拖入脚本的prefab框

2、 编程实践,小游戏

游戏内容: 井字棋 或 贷款计算器 或 简单计算器 等等

技术限制: 仅允许使用 IMGUI 构建 UI

作业目的:

  • 了解 OnGUI() 事件,提升 debug 能力

  • 提升阅读 API 文档能力

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

public class UI : MonoBehaviour
{
    public Texture2D piece1;
    public Texture2D piece2;
    public Texture2D backgound;
    private int who_play;
    private int who_win;
    private int[,] matrix2D;
    private int[] repent;

    void OnGUI()
    {
        GUIStyle fontStyle = new GUIStyle();
        fontStyle.normal.background = null;
        fontStyle.normal.textColor = new Color(1, 1, 1);
        fontStyle.fontSize = 20;
        GUI.Label(new Rect(400, 200, 100, 100), "");
        if (GUI.Button(new Rect(400, 0, 100, 100), "restart"))
            Reset();
        if (who_win == 0 && GUI.Button(new Rect(400, 100, 100, 100), "repent"))
            Repent();
        
        
 
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; ++j)
            {
                if (matrix2D[i, j] == 1)
                    GUI.Button(new Rect(100 * i, 100 * j, 100, 100), piece1);
                else if (matrix2D[i, j] == 2)
                    GUI.Button(new Rect(100 * i, 100 * j, 100, 100), piece2);
                else
                {
                    if (GUI.Button(new Rect(100 * i, 100 * j, 100, 100), backgound))
                        if(who_win == 0)
                        {

                        matrix2D[i, j] = 1 + who_play % 2;
                        repent[0] = i; repent[1] = j;
                        who_win = check();
                        who_play++;
                        }
                }
            }
        }
        if (who_win != 0)
        {
            GUI.Label(new Rect(400, 200, 100, 100), "player"+who_win+" wins!", fontStyle);
        }
        else
        {
            GUI.Label(new Rect(400, 200, 100, 100), "Playing...", fontStyle);
        }
    }

    void Start()
    {
        Reset();

    }

    void Reset()
    {
        who_play = 0;
        who_win = 0;
        matrix2D = new int[3, 3]
        {
            {0,0,0},
            {0,0,0},
            {0,0,0}
        };
        repent = new int[2] { 0, 0 };

    }

    void Repent()
    {
        who_play++;
        matrix2D[repent[0], repent[1]] = 0;
    }

    int check()
    {
        for (int i = 0; i < 3; i++)
        {
            if (matrix2D[i, 0] == matrix2D[i, 1] && matrix2D[i, 1] == matrix2D[i, 2] && matrix2D[i, 0] != 0)
                return matrix2D[i, 0];
            if (matrix2D[0, i] == matrix2D[1, i] && matrix2D[1, i] == matrix2D[2, i] && matrix2D[0, i] != 0)
                return matrix2D[0, i];
        }
        if (matrix2D[0, 0] == matrix2D[1, 1] && matrix2D[1, 1] == matrix2D[2, 2])
            return matrix2D[1, 1];
        if (matrix2D[0, 2] == matrix2D[1, 1] && matrix2D[1, 1] == matrix2D[2, 0])
            return matrix2D[1, 1];
        return 0;
    }

    void Update()
    {

    }
}


运行效果如下图
在这里插入图片描述

注意,需要将配置贴图资源,需要设置棋子1,棋子2和背景的贴图。
见图
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3d游戏编程与设计 的相关文章

  • njx如何实现负载均衡_LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡

    前言 首先声明下 由于这两天找资料 看了不少博客 但是出于不细心 参考者的博客地址没有记录下来 所有文中要是出现了与大家博客相同的地方 那么请大家在评论区说明并附上博客地址 我好引用进来 这里表示抱歉了 另外 本文是在我的另一篇博客主从热备
  • element-ui渲染el-table表格小技巧

    element ui中table的使用 当el table元素中注入data对象数组后 在el table column中用prop属性来对应对象中的键名即可填入数据 用label属性来定义表格的列名 可以使用width属性来定义列宽 相当
  • Qt 多项目系统中如何指定各项目的编译顺序 (***笔记)

    QT学习笔记 QT多项目系统中如何指定各项目的编译顺序 Qt pri 创建使用 pri文件 Qt pro文件 pri文件的写法 Qt 多项目系统中如何指定各项目的编译顺序 笔记 https blog csdn net ken2232 art
  • 目标跟踪算法——KCF入门详解

    一直以来没有很想写这个 以为这个东西比较简单 还算是比较容易理解的一个算法 但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西 我一直以为关于细节的东西大家可以自己去理解 大家都是想快速了解这个 那我就厚脸皮了在这写一下自己的见
  • 场景二:Git远程版本库的基本用法

    1 克隆远程版本库 如果你已经在Gitee或者GitHub等网站上创建了Git版本库 可以通过git clone命令 将版本库克隆到本地完成本地版本库的初始化 git clone命令的用法如下 git clone https DOMAIN
  • 由羽毛球拍想到的

    羽毛球拍 品牌太多 如何选择 看到红双喜厂商的具体套路 才知这个市场与手机市场一样 都是低端的外包 高端的自己做 但是 球拍这个东西高端的和低端的普通人能看出区别 许多生活中的产品都是如此 例如空调 格力之类的空调压缩机许多也是采购第三方的
  • Python之花舞盛宴:探索列表与元组之美与妙用

    前言 在Python编程世界中 列表和元组是两个最常用的数据结构之一 无论是初学者还是经验丰富的开发者 对于这两个数据类型的掌握都至关重要 列表和元组都是用于存储多个值的容器 但它们在性质和特性上有所不同 列表是可变的 可以随意修改 添加或
  • 用java有理数类包含加减乘除,7.1 面向对象的简介 - VimL 语言编程指北路

    面向对象是一种编程思想 并不特指某种编程语言 所以不必惊讶用 VimL 也能以面向 对象的方式来写代码 本章先简单介绍一下面向对象的编程思想 再探讨如何利用 VimL 现有的特性实现面向对象编程 最后应由用户自行决定是否有必要使用面向对象的
  • C++学习系列之求圆柱体的体积

    实例要求 以函数调用的方式 求圆柱体的体积 主函数中先输入圆柱体的半径和高 调用求体积的函数 输出结果 代码如下 include
  • linux服务器运维

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 no space left on device 原因 磁盘满了 inode耗尽
  • 如何将Web主页性能提升十倍以上?

    给IT平头哥联盟加星标 提升前端技能 作者 exAspArk 译者 核子可乐 最近 我们将 Universe com 主页的性能提升了十倍以上 在本文中 我们将解析实现这一重大改进的具体技术手段 但在开始之前 让我们先对网络性能的重要意义进
  • C 基本语法

    原文链接 https www runoob com cprogramming c basic syntax html 我们已经看过 C 程序的基本结构 这将有助于我们理解 C 语言的其他基本的构建块 C 的令牌 Tokens C 程序由各种
  • Selenium+python之不打开浏览器,来运行测试用例

    调用浏览器 来进行自动化测试 是一个常规操作 或者说针对少量测试用例 可以打开浏览器运行 但是针对大量运行测试用例来说 如果每个测试用例都需要调用一次 浏览器 那么无疑对服务器增加了巨大的压力 那么有没有一个办法 不调用浏览器 让浏览器在后
  • (只需两步)让ChatGPT免费帮你制作出漂亮的PPT

    目录 第一步 生成 PPT 代码 第二步 将代码转化为 PPT 还在为制作PPT而烦恼吗 让ChatGPT来帮您 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式 省时省力又专业 真的只需两步 真的非常简单 以下部分生成效果 pp
  • bash和sh的区别

    一 简述 Shell 中文意思贝壳 寓意类似内核的壳 Shell是指一种应用程序 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务 Shell 是一个用 C 语言编写的程序 它是用户使用 Linux 的桥梁 Shell 既
  • 一文搞懂Ubuntu环境变量

    用户级别的环境变量 bash profile bash login bashrc 坑的原理 1 当bash shell作为登录shell启动时 比如用户登录系统时 首先会查找并执行 bash profile文件 如果这个文件不存在 那么它会
  • R根据列名提取想要的列

    数据格式如下 a b c d e 1 2 3 4 5 使用select过滤不要的列 df which names df in c a b subset df select c a b 使用select选择想要的列 df c x y subs
  • 微信小程序 真机调试无法请求localhost

    问题描述 在微信开发者工具里能正常请求后台数据 但真机调试时 却报localhost请求失败的错误 解决方案 在客户端的config js中 把host里的localhost改成本机在局域网里的ip地址即可 服务端可继续沿用localhos
  • 【云原生】kubectl常用命令大全

    目录 一 资源管理方法 kubectl 的命令大全 二 kubectl常用命令大全 2 2 项目的生命周期 创建 gt 发布 gt 更新 gt 回滚 gt 删除 1 创建 kubectl create命令 2 发布 kubectl expo
  • plt.show无法显示图片

    省流 Linux系统本来就没有图形界面 import matplotlib pyplot as plt plt savefig img png 引号里是保存的路径 像此处示例就是相对路径 保存在当前文件夹 远程服务器连接Linux系统 则保

随机推荐

  • SpringAOP+自定义注解实现日志功能

    SpringAOP 自定义注解实现日志功能 上篇文章讲解了springAOP实现简单日志功能 这次讲解使用自定义注解实现日志功能 具体pom Spring SpringMVC的配置不再进行讲解 详情点击链接查看SpringAOP Aspec
  • 前端性能优化之Gzip

    前端性能优化之Gzip 什么是GZIP gzip是GNUzip的缩写 它是一个GNU自由软件的文件压缩程序 它是Jean loupGailly和MarkAdler一起开发的 压缩原理 Gzip 压缩背后的原理 是在一个文本文件中找出一些重复
  • Flutter 23: 图解 PopupMenu 那些事儿

    小菜需要处理标题栏弹出对话框 PopupMenu 样式 Flutter 当然提供了一些处理方式 类似 PopupMenuEntry 等 小菜仅就最基础的使用方式进行初步的学习和整理 PopupMenuItem 基本样式 PopupMenuI
  • 同态加密的基本概念

    所谓的同态加密 HE homomorphic encryption 是指 对明文m加密 得到密文c 满足f c 是f m 的密文 其中f是任意属于某个函数族F的函数 明文可以是单个明文 也可以是明文向量 对应的为单个密文和密文向量 而对应的
  • JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?

    一 问题描述 假设有两个线程在并发运行 一个线程执行的代码中含有一个死循环如 while true 当该线程在执行while true 中代码时 另一个线程会有机会执行吗 二 示例代码 代码来源于互联网 1 public class Ser
  • redis的有序集合在score相同的情况 下是如何排序的

    前两天倒腾redis的有序集合时 自己发现了一个问题 redis的有序集合在score相同的情况 下是如何排序的 通过谷歌搜索 发现了一些线索 在score相同的情况下 redis使用字典排序 不过不是太明白什么是字典排序 这就是非科班出生
  • TortoiseSVN安装及使用方法

    安装说明 首先安装SVN客户端 windows一般选择乌龟客户端https tortoisesvn net downloads html 根据系统位数选择相应客户端进行安装 如果你喜欢用命令行操作 请务必记得勾选command line c
  • Python中PyEcharts库安装报错的解决办法

    如果安装pyecharts后 进行导包操作 如from pyecharts import Line 报错 出现类似connot import name Line 问题 那么下面给出了解决办法 方法一 通过查看包安装位置发现 在pyechar
  • 解决关闭hbase时stop-hbase.sh报错stopping hbasecat: /tmp/hbase-xxxx-master.pid: No such file or directory

    完整报错是 stopping hbasecat tmp hbase xxxx master pid No such file or directory 解决方法 sudo mkdir p var hadoop pids 然后进入hbase的
  • 利用wireshark对TCP抓包分析

    抓包结果已上传可免费下载对应观看 wireshark抓包结果 一 流程梳理 我的机子192 168 1 131简称A与服务端机子223 166 138 30简称B先三次握手建立TCP连接 再进行HTTP请求 最后四次挥手断开TCP连接 1
  • 如何使用QT?步骤详解

    1 首先第一步 电脑上安装qt软件 我这里安装的是qt5 5中文版本的 2 打开qt 点击左上角欢迎图标 或者也可选择文件栏目创建一个新的工程目录 3 选择New Project 如果你要使用QT来写代码c或者c 都可以选择 非QT项目栏
  • 解决Unity鼠标坐标点转成世界坐标系坐标点

    第一种 这是一种发射线 获取当前点击的物体 具有碰撞器 的坐标点 也就是碰撞器范围的坐标点 if Input GetMouseButtonDown 0 RaycastHit hitt new RaycastHit Ray ray Camer
  • c++中 string与string.h 的作用、区别和C++头文件的现状

    示例1 include
  • 根据经纬度求两点间距离实现源码(C#)-非常精确

    从Google Map上弄来的根据经纬度求地球表面两点间距离的实现 稍微改编了一下 对于我国境内空间距离计算 该实现已经够用 以米为单位 Net2 0 C 实现 public static double DistanceOfTwoPoint
  • KALI安装Pycharm

    由于直接在KALI中下载Pycharm速度往往不太理想 所以可以在本机内提前安装 再传输进KALI Pycharm下载地址 Download PyCharm Python IDE for Professional Developers by
  • 怎么样利用栅格数据分类后的结果以行政区域统计各个地类的面积

    怎么样利用栅格数据分类后的结果以行政区域统计各个地类的面积 通常在土地利用调查工作中 基于一张已经分类好的栅格数据 遥感图像数据 政府部门有需求去统计一个县或者一个乡的各类型土地的面积 如下图所示 不同的颜色代表不同的土地类型 一般 行政区
  • Python编程从入门到实践(四)-if语句

    1 一个简单示例 假设你有一个汽车列表 并想将其中每辆汽车的名称打印出来 对于大多数汽车 都应以首字母大写的方式打印其名称 但对于汽车名 bmw 应以全大写的方式打印 下面的代码遍历一个列表 并以首字母大写的方式打印其中的汽车名 但对于汽车
  • Unity3D之触摸输入单击与双击研究

    新建一个plane物体 tag设为Terrain 新建一个Cube物体 添加Rigidbody组件 tag设为Player 创建一个脚本TouchTest02 将该脚本挂到Cube物体上 本示例实现如下效果 当单击触摸屏时Cube移动到指定
  • Elasticsearch 笔记

    文章目录 Elasticsearch 基础 Lucene 简介 Elasticsearch 是什么 Elasticsearch 用途用例 Elasticsearch 的工作原理 Elasticsearch 索引 Elasticsearch
  • 3d游戏编程与设计

    目录 1 简答题 解释游戏对象 object 和资源 asset 的区别和联系 下载几个游戏案例 分别总结资源 对象组织的结构 指资源的目录组织结构与游戏对象树的层次结构 编写一个代码 使用 debug 语句来验证 MonoBehaviou