3D游戏编程:第5次作业

文章目录

  • 3D游戏编程:第5次作业
    • 编写一个简单的鼠标打飞碟(HitUFO)游戏
      • 游戏要求
      • 项目地址与演示视频
      • 代码实现
        • 代码挂载
        • 代码组织结构
        • 代码简析
          • 1 飞碟运动控制器: `CCActionManager.cs`
          • 2 检测点击对象: `PickUpObject.cs`
          • 3 场景控制器: `FirstController.cs`
          • 4 用户界面 GUI :`View.vs`

编写一个简单的鼠标打飞碟(HitUFO)游戏

游戏要求

  • 游戏内容要求:

    1. 游戏有 n 个 round, 每个 round 都包括10 次 trial;
    2. 每个 trial的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该round的 ruler 控制;
    3. 每个 trial 的飞碟有随机性,总体难度随 round 上升;
    4. 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。
  • 游戏的要求:
    1. 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类;

    2. 尽可能使用前面 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次作业相关推荐

  1. 3D游戏编程与设计作业10

    3D游戏编程与设计作业10 环境说明 Unity3D 导航与寻路 Agent 和 Navmesh 练习 Obstacle和Off-Mesh-Link练习 P&D 过河游戏智能帮助实现 状态图 ...

  2. 3D游戏编程与设计——游戏的本质章节作业与练习

    3D游戏编程与设计--游戏的本质章节作业与练习 18342138 郑卓民 3D游戏编程与设计--游戏的本质章节作业与练习 作业与练习: 游戏名称及简介: 游戏的随机性 游戏的玩法与目标 游戏的冲突 游 ...

  3. 3D 游戏编程与设计:第3次作业

    3D 游戏编程与设计:第3次作业 姓名:韩宝欣 学号:20331013 代码仓库:https://gitee.com/sse_20331013/3d-game.git 文章目录 3D 游戏编程与设计: ...

  4. 3D游戏编程与设计作业09

    3D游戏编程与设计作业09 UGUI基础 画布 基础概念 测试渲染模式 UI布局基础 基本概念 锚点练习 UI组件与元素 基本概念 Mask练习 动画练习 富文本测试 简单血条 血条(Health B ...

  5. 3D游戏编程学习笔记(七):模型与动画

    一.前言 本次3D游戏编程我们将设计一个智能巡逻兵游戏. 二.游戏基本内容及规定 游戏内容部分 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次 ...

  6. 3D游戏编程与设计 PD(牧师与恶魔)过河游戏智能帮助实现

    3D游戏编程与设计 P&D(牧师与恶魔) 过河游戏智能帮助实现 文章目录 3D游戏编程与设计 P&D(牧师与恶魔) 过河游戏智能帮助实现 一.作业与练习 二.设计简述 1. 状态图基础 ...

  7. 3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版)

    3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版) 文章目录 3D游戏编程与设计 HW 4.5 牧师与恶魔(动作分离版) 1.作业要求 2.游戏制作 ① 设计思路 ② 设计代码 一.Actio ...

  8. 3D游戏编程与设计-井字棋

    3D游戏编程与设计-井字棋 目录 3D游戏编程与设计-井字棋 A. 简答题 1. 解释游戏对象(GameObjects)和资源(Assets)的区别与联系 ① 游戏对象 ② 资源 2. 下载几个游戏案 ...

  9. 3d游戏编程(转帖)

    3d游戏编程(转帖) 我先声明,我不是编程高手,我还只是个初学者,但我觉得我所知道的对刚入门3D游戏编程的新手,应该能让他们少走弯路,我也很想用朝语来写,但是朝语的词 汇库很久没有更新过了,有些专业的 ...

最新文章

  1. 2017 ACM/ICPC 南宁赛区小结 By JSB @ Reconquista
  2. Github多人合作用法
  3. Sublime Text 3 配置浏览器预览路径 localhost
  4. MySQL 复制夯住排查以及原理探讨
  5. c++基础学习(10)--(文件、流、异常处理、动态内存、命名空间)
  6. SQL语句汇总(一)——数据库与表的操作以及创建约束
  7. 关于java中Exception异常
  8. 一个winform中多线程的例子
  9. 基于java的试题库管理系统(java CS窗体版)
  10. LINGO11 百度网盘
  11. 主机与虚拟机ping通
  12. python3GUI--你喜欢的无损音乐下载工具(附源码)
  13. 2.25亿个邮箱密码被盗、微软漏洞或致黑客接管域控制器|12月23日全球网络安全热点
  14. 微信群发助手怎么使用?微信群发助手怎么发?
  15. libusb,libusbk,winusb的区别
  16. android开源轮播图框架,最好用的轮播插件框架都在这里了,Github流行轮播框架...
  17. pareto最优解程序_求多目标优化问题Pareto最优解集的方法
  18. 二维vector的创建
  19. python 老男孩全套教程-老男孩全栈python视频教程104天【百度网盘】
  20. x200换屏_小黑本“清凉一夏” — Thinkpad X200 拆解清理

热门文章

  1. 闲鱼内容视频化展示方案(超全面)
  2. After Effect(AE)PuppetTools脚本插件使用
  3. 中国校友会网2012中国大学排行榜100强
  4. 西施陪他游湖,金庸为他写书,2000多年前的他有何过人之处?
  5. 中国地名省市区xml
  6. mtk-2017 GPS Training
  7. 有关感知器的一个小故事
  8. 今天使用gson json字符串转对象的时候,一直报错Unterminated object at line 1 column 14
  9. 怎么选择产品摄影的最佳相机?
  10. 图尔库远程IO与AB plc的通讯