3D游戏编程:第5次作业
3D游戏编程:第5次作业
文章目录
- 3D游戏编程:第5次作业
- 编写一个简单的鼠标打飞碟(HitUFO)游戏
- 游戏要求
- 项目地址与演示视频
- 代码实现
- 代码挂载
- 代码组织结构
- 代码简析
- 1 飞碟运动控制器: `CCActionManager.cs`
- 2 检测点击对象: `PickUpObject.cs`
- 3 场景控制器: `FirstController.cs`
- 4 用户界面 GUI :`View.vs`
编写一个简单的鼠标打飞碟(HitUFO)游戏
游戏要求
- 游戏内容要求:
- 游戏有 n 个 round, 每个 round 都包括10 次 trial;
- 每个 trial的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该round的 ruler 控制;
- 每个 trial 的飞碟有随机性,总体难度随 round 上升;
- 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。
- 游戏的要求:
使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类;
尽可能使用前面 MVC 结构实现人机交互与游戏模型分离。
项目地址与演示视频
项目地址:https://gitee.com/sse_20331013/3d-game/tree/master/%E4%BD%9C%E4%B8%9A%E4%BA%94%EF%BC%9AHitUFO
运行效果(视频上传出了点问题,所以用动图代替了)
代码实现
代码挂载
<img src="C:\Users\Eh\Desk
mainCamera 的挂载
fireUFO 的挂载
代码组织结构
(尝试了 Disk,但是没有 Debug 出错误,所以还是和前两次作业的结构差不多)
代码组织结构
代码简析
1 飞碟运动控制器: CCActionManager.cs
// num: 飞碟的编号
public void UFOToDestination(int num)
{GameObject obj = sceneController.goList[num];obj.transform.position = new Vector3(Random.Range(-1 * 100 / 2, 100 / 2), Random.Range(-1 * 100 / 2, 100 / 2), 100);CCSequenceAction css = CCSequenceAction.GetSSAction(1, 0, new List<SSAction> {shakeTheDestination(50), shakeTheDestination(25), shakeTheDestination(10), shakeTheDestination(5)});// 改变 goList_usedAndFree[i] = 1;sceneController.goList_usedAndFree[num] = 1;this.RunAction(obj, css, this);
}public CCMoveToAction shakeTheDestination(int positionZ)
{return CCMoveToAction.GetSSAction(new Vector3(Random.Range(-1 * positionZ/2 , positionZ/2), Random.Range(-1* positionZ/2, positionZ/2), positionZ), SSDirector.getInstance().GetCreditCount() / 300 + 10);
}// UFO坠落:被点击时
public void UFODrop(int num)
{GameObject obj = sceneController.goList[num];CCMoveToAction ccma = CCMoveToAction.GetSSAction(new Vector3(obj.transform.position.x, -100, obj.transform.position.z), 50);this.RunAction(obj, ccma, this);
}// 隐藏UFO:飞碟空闲时public void hideUFO(int num){GameObject go = sceneController.goList[num];go.transform.position = new Vector3(0, 0, -5);}
2 检测点击对象: PickUpObject.cs
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;public class PickupObject : MonoBehaviour
{public GameObject cam;// Update is called once per framevoid Update(){if (Input.GetButtonDown("Fire1")){Vector3 mp = Input.mousePosition; //get Screen Position// create ray, origin is camera, and direction to mousepointCamera ca;if (cam != null) ca = cam.GetComponent<Camera>();else ca = Camera.main;Ray ray = ca.ScreenPointToRay(Input.mousePosition);// Return the ray's hitRaycastHit hit;if (Physics.Raycast(ray, out hit)){// 如果游戏结束,则不能点击if (SSDirector.getInstance().gameEnd) return;if (hit.collider.gameObject.tag.Contains("Finish")){ // plane tag}GameObject parentGameObject = hit.transform.parent.gameObject;SSDirector ssdDirector = SSDirector.getInstance();// Debug.Log(parentGameObject.GetComponent<UFOController>().getNum()); 不能用这个确定UFO的index,原因未知// 计算得分 按距离相机位置算分数int credit = (int)Vector3.Distance(parentGameObject.transform.position, new Vector3(0, 1, 0));ssdDirector.AddCreditCount(credit);ssdDirector.ccam.UFODrop(ssdDirector.firstcontroller.getGameObjectIndex(parentGameObject.transform.position));}}}
}
若飞碟检测到被点击,则计算得分,再传递给 SSDirect
,对此飞碟进行坠落操作。
最后检测飞碟的状态,若已坠落,则进行回收 (SSActionManager.cs
)
foreach (int key in waitingDelete)
{SSAction ac = actions[key];// 检查是不是掉落的UFO,如果是的话Y轴高度低于-90,然后检查actions中是否还有掉落UFO的运动,有的话就删除它们的运动,然后把它们移动到隐藏位置// 如果不是掉落的UFO,则说明UFO已经到达指定位置,突围成功,游戏结束if (ac.transform.position.y < -50){foreach (KeyValuePair<int, SSAction> kv in actions){SSAction t_ac = kv.Value;if (t_ac != ac && ac.gameobject == t_ac.gameobject){t_ac.destory = true;// 隐藏SSDirecWtor ssdDirector = SSDirector.getInstance();ssdDirector.ccam.hideUFO(ssdDirector.firstcontroller.getGameObjectIndex(ac.transform.position));ssdDirector.firstcontroller.goList_usedAndFree[ssdDirector.firstcontroller.getGameObjectIndex(ac.transform.position)] = 0;}}}//到达了最终位置else if (ac.transform.position.z <= 10){//codeSSDirector ssdDirector = SSDirector.getInstance();ssdDirector.gameEnd = true;}actions.Remove(key);Destroy(ac);
}
3 场景控制器: FirstController.cs
检测飞碟是否空闲,若空闲,则可以重生:
// Update is called once per frame
void Update()
{for (int i = 0; i < goList_usedAndFree.Count; ++i){if (goList_usedAndFree[i] == 0){SSDirector.getInstance().ccam.UFOToDestination(i);}}
}
4 用户界面 GUI :View.vs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class View : MonoBehaviour
{// Start is called before the first frame updateprivate SSDirector ssdDirector;private int credit;private bool gameEnd;void Start(){ssdDirector = SSDirector.getInstance();gameEnd = false;}// Update is called once per framevoid Update(){credit = ssdDirector.GetCreditCount();gameEnd = ssdDirector.gameEnd;}void OnGUI(){// 字体初始化GUIStyle bigStyle = new GUIStyle();bigStyle.normal.textColor = Color.white;bigStyle.fontSize = 30;GUI.Label(new Rect(0, 0, 100, 30), "Round one", bigStyle);GUI.Label(new Rect(200, 0, 100, 30), "Total Credit:" + credit, bigStyle);bigStyle.normal.textColor = Color.red;bigStyle.fontSize = 50;// 游戏结束if (gameEnd){if (GUI.Button(new Rect(450, 280, 100, 50), "RESTART")){SSDirector.getInstance().ReStartGame();begin();}GUI.Label(new Rect(120, 200, 50, 200), "Congratulations on getting " + credit + " Points", bigStyle);}}public void begin(){gameEnd = false;}
}
3D游戏编程:第5次作业相关推荐
- 3D游戏编程与设计作业10
3D游戏编程与设计作业10 环境说明 Unity3D 导航与寻路 Agent 和 Navmesh 练习 Obstacle和Off-Mesh-Link练习 P&D 过河游戏智能帮助实现 状态图 ...
- 3D游戏编程与设计——游戏的本质章节作业与练习
3D游戏编程与设计--游戏的本质章节作业与练习 18342138 郑卓民 3D游戏编程与设计--游戏的本质章节作业与练习 作业与练习: 游戏名称及简介: 游戏的随机性 游戏的玩法与目标 游戏的冲突 游 ...
- 3D 游戏编程与设计:第3次作业
3D 游戏编程与设计:第3次作业 姓名:韩宝欣 学号:20331013 代码仓库:https://gitee.com/sse_20331013/3d-game.git 文章目录 3D 游戏编程与设计: ...
- 3D游戏编程与设计作业09
3D游戏编程与设计作业09 UGUI基础 画布 基础概念 测试渲染模式 UI布局基础 基本概念 锚点练习 UI组件与元素 基本概念 Mask练习 动画练习 富文本测试 简单血条 血条(Health B ...
- 3D游戏编程学习笔记(七):模型与动画
一.前言 本次3D游戏编程我们将设计一个智能巡逻兵游戏. 二.游戏基本内容及规定 游戏内容部分 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次 ...
- 3D游戏编程与设计 PD(牧师与恶魔)过河游戏智能帮助实现
3D游戏编程与设计 P&D(牧师与恶魔) 过河游戏智能帮助实现 文章目录 3D游戏编程与设计 P&D(牧师与恶魔) 过河游戏智能帮助实现 一.作业与练习 二.设计简述 1. 状态图基础 ...
- 3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版)
3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版) 文章目录 3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版) 1.作业要求 2.游戏制作 ① 设计思路 ② 设计代码 一.Actio ...
- 3D游戏编程与设计-井字棋
3D游戏编程与设计-井字棋 目录 3D游戏编程与设计-井字棋 A. 简答题 1. 解释游戏对象(GameObjects)和资源(Assets)的区别与联系 ① 游戏对象 ② 资源 2. 下载几个游戏案 ...
- 3d游戏编程(转帖)
3d游戏编程(转帖) 我先声明,我不是编程高手,我还只是个初学者,但我觉得我所知道的对刚入门3D游戏编程的新手,应该能让他们少走弯路,我也很想用朝语来写,但是朝语的词 汇库很久没有更新过了,有些专业的 ...
最新文章
- 2017 ACM/ICPC 南宁赛区小结 By JSB @ Reconquista
- Github多人合作用法
- Sublime Text 3 配置浏览器预览路径 localhost
- MySQL 复制夯住排查以及原理探讨
- c++基础学习(10)--(文件、流、异常处理、动态内存、命名空间)
- SQL语句汇总(一)——数据库与表的操作以及创建约束
- 关于java中Exception异常
- 一个winform中多线程的例子
- 基于java的试题库管理系统(java CS窗体版)
- LINGO11 百度网盘
- 主机与虚拟机ping通
- python3GUI--你喜欢的无损音乐下载工具(附源码)
- 2.25亿个邮箱密码被盗、微软漏洞或致黑客接管域控制器|12月23日全球网络安全热点
- 微信群发助手怎么使用?微信群发助手怎么发?
- libusb,libusbk,winusb的区别
- android开源轮播图框架,最好用的轮播插件框架都在这里了,Github流行轮播框架...
- pareto最优解程序_求多目标优化问题Pareto最优解集的方法
- 二维vector的创建
- python 老男孩全套教程-老男孩全栈python视频教程104天【百度网盘】
- x200换屏_小黑本“清凉一夏” — Thinkpad X200 拆解清理