3D游戏编程 homework 2

2024-01-17 02:38
文章标签 编程 3d 游戏 homework

本文主要是介绍3D游戏编程 homework 2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简答题

游戏对象运动的本质是什么?

在游戏中一个对象的运动都是相对于某一个坐标系的运动,实质上就是坐标的改变,通过坐标改变的速度以及方法实现各种运动。

请用三种方法以上方法,实现物体的抛物线运动

方法一:使用向量计算出每个时刻球应该在的位置,再把这个向量的坐标赋给球的位置,通过translate函数实现

public class move : MonoBehaviour
{private float vx = 5f, vy = 0f;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){Vector3 po = new Vector3(Time.deltaTime * vx, Time.deltaTime * vy, 0);this.transform.Translate(po);vy = vy - 10 * Time.deltaTime;}
}

方法二:对物体的position进行直接更改

public class move : MonoBehaviour
{private float vx = 5f, vy = 0f;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){Vector3 po = new Vector3(Time.deltaTime * vx, Time.deltaTime * vy, 0);this.transform.position += po;vy = vy - 10 * Time.deltaTime;}
}

方法三:使用vector3的差值函数实现

public class move : MonoBehaviour
{private float vx = 5f, vy = 0f;// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){Vector3 po = new Vector3(Time.deltaTime * vx, Time.deltaTime * vy, 0);transform.position = Vector3.Lerp(transform.position, transform.position + po, 1);vy -= 10 * Time.deltaTime;}
}
写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上

主要是用到了RotateAround函数来实现各个行星绕太阳的旋转。然后对于法平面的控制主要由Vector3向量来实现,而速度则是RotateAround的第三个参数。代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class move : MonoBehaviour
{// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){GameObject.Find("水星").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 50 * Time.deltaTime);GameObject.Find("金星").transform.RotateAround(Vector3.zero, new Vector3(1, 1, 0), 55 * Time.deltaTime);GameObject.Find("地球").transform.RotateAround(Vector3.zero, new Vector3(2, 0, 0), 60 * Time.deltaTime);GameObject.Find("月亮").transform.RotateAround(GameObject.Find("地球").transform.position, Vector3.up, 300 * Time.deltaTime);GameObject.Find("火星").transform.RotateAround(Vector3.zero, new Vector3(1, 2, 0), 65 * Time.deltaTime);GameObject.Find("木星").transform.RotateAround(Vector3.zero, new Vector3(0.2f, 1, 0), 70 * Time.deltaTime);GameObject.Find("土星").transform.RotateAround(Vector3.zero, new Vector3(0.3f, 1, 0), 75 * Time.deltaTime);GameObject.Find("天王星").transform.RotateAround(Vector3.zero, new Vector3(0.4f, 1, 0), 85 * Time.deltaTime);GameObject.Find("海王星").transform.RotateAround(Vector3.zero, new Vector3(-0.7f, 1, 0), 80 * Time.deltaTime);}
}

搭建的模型如下:
在这里插入图片描述
运行过程截图如下:
在这里插入图片描述
在这里插入图片描述

编程实践

阅读以下游戏脚本

Priests and Devils

Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the river. They all want to get to the other side of this river, but there is only one boat and this boat can only carry two persons each time. And there must be one person steering the boat from one side to the other side. In the flash game, you can click on them to move them and click the go button to move the boat to the other direction. If the priests are out numbered by the devils on either side of the river, they get killed and the game is over. You can try it in many > ways. Keep all priests alive! Good luck!

程序需要满足的要求:

play the game ( http://www.flash-game.net/game/2535/priests-and-devils.html )
列出游戏中提及的事物(Objects)
用表格列出玩家动作表(规则表),注意,动作越少越好
请将游戏中对象做成预制
在 GenGameObjects 中创建 长方形、正方形、球 及其色彩代表游戏中的对象。
使用 C# 集合类型 有效组织对象
整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成!!! 。 整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的 通讯耦合 语句。 违背本条准则,不给分
请使用课件架构图编程,不接受非 MVC 结构程序
注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!

  1. 游戏中的事物
    游戏中主要有牧师、魔鬼、小船、河岸、河水。

  2. 玩家动作表

动作条件
上岸船里有人,船在岸边
上船船上人数小于2,人和船在相同的岸边
下船船上有人,船在岸边
开船船上有人,船在岸边
成功牧师和魔鬼都在左岸
失败有至少一个牧师死亡
牧师被吃一边的岸上加船上(如果传靠岸)牧师数量小于魔鬼数量

为了使用MVC模型,所以需要将控制与图像物体区分开来编写主要采用了往届师兄的代码。
首先为了达到各个脚本文件之间的通信,所以使用到命名空间,这个命名空间放到Base.cs文件中,在这个文件中还定义了之后需要使用到的各种函数。主要的有Director导演,实例化唯一的一个导演来对游戏进行控制,还有对船的相关操作的定义控制,对系统需要响应的动作的控制,对岸边的控制,其中河岸与船实际上都可以使用实例化来解决。
然后是对view的控制,使用userGUI与clickGUI来分别定义用户的操作,(例如开始与重来)与点击事件(上船,下船,船过河)
详细的过程可以看代码的注释部分。
游戏运行过程如下
在这里插入图片描述
恶魔与牧师
运行视频

这篇关于3D游戏编程 homework 2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614668

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空