Unity: 打飞碟Adapter版

游戏规则

  • 一共有三个回合,随着回合增加,单位时间出现的飞碟数合飞碟的速度都会增加
  • 分数由玩家点击的飞碟颜色决定,黑色6分,红色4分,黄色2分
  • 每个回合有20个飞碟
  • 没有失败的条件,最后看分数多少

游戏场景

代码组织结构

代码结构有所更新


在上一次的基础上把CCFlyAction换成CCPhysicAction,CCActionManager 换成CCPhysicActionManager即可

代码改动

Interfaces.cs: 添加了IAction接口,实际上就是Manger里的函数

using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace Interfaces
{public interface ISceneController{void LoadResources();}public interface UserAction{void Hit(Vector3 pos);      //鼠标点击void Restart();             //开始和重新开始都一样int GetScore();             bool RoundStop();           //最后的回合结束int GetRound();             }   public enum SSActionEventType : int { Started, Completed }public interface SSActionCallback{void SSActionCallback(SSAction source);}public interface IActionManager{void MoveDisk(Disk disk);bool IsAllFinished(); //主要为了防止游戏结束时场景还有对象但是GUI按钮已经加载出来}
}

CCPhysicAction.cs: 新增的类,代替CCFlyAction执行飞行运动,刚体

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CCPhysicAction : SSAction
{public float speedx;// Use this for initializationpublic override void Start(){//添加刚体组件if (!this.gameObject.GetComponent<Rigidbody>()){this.gameObject.AddComponent<Rigidbody>();}//添加重力this.gameObject.GetComponent<Rigidbody>().AddForce(Vector3.up * 9.8f * 0.6f, ForceMode.Acceleration);//设置初速度this.gameObject.GetComponent<Rigidbody>().AddForce(new Vector3(speedx, 0, 0), ForceMode.VelocityChange);}private CCPhysicAction(){}public static CCPhysicAction getAction(float speedx){CCPhysicAction action = CreateInstance<CCPhysicAction>();action.speedx = speedx;return action;}// Update is called once per frameoverride public void Update(){if (transform.position.y <= 3){Destroy(this.gameObject.GetComponent<Rigidbody>());//如果不移除刚体属性会导致前面添加的速度属性累积。destroy = true;CallBack.SSActionCallback(this);}}
}

CCPhysicActionManager.cs: 新增的类,代替CCActionManager对动作进行管理(合CCAction一样,只是便于区分,继承了IActionManager接口)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Interfaces;//具体管理飞行动作的管理器
public class CCActionManager : SSActionManager, SSActionCallback, IActionManager
{int count = 0;//记录所有在移动的碟子的数量public SSActionEventType Complete = SSActionEventType.Completed;public void MoveDisk(Disk Disk){count++;Complete = SSActionEventType.Started;CCFlyAction action = CCFlyAction.getAction(Disk.speed);addAction(Disk.gameObject, action, this);}public void SSActionCallback(SSAction source) //运动事件结束后的回调函数{count--;Complete = SSActionEventType.Completed;source.gameObject.SetActive(false);}public bool IsAllFinished() //主要为了防止游戏结束时场景还有对象但是GUI按钮已经加载出来{if (count == 0) return true;else return false;}
}

最后再把FirstSceneController里的Manager类型修改为IActionManager,并初始化即可。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Interfaces;public class FirstSceneController : MonoBehaviour, ISceneController, UserAction
{int score = 0;      //分数int round = 1;      //回合,设置了3个int producedDiskNum = 0;    //每回合已经产生的飞碟数目bool start = false;IActionManager Manager;DiskFactory DF;void Awake(){SSDirector director = SSDirector.getInstance();director.currentScenceController = this;DF = DiskFactory.DF;Manager = this.gameObject.AddComponent<CCPhysicActionManager>() as IActionManager;}// Use this for initializationvoid Start () {}// Update is called once per frameint count = 0;void Update () {//val帧产生一个飞碟int val;switch (round){case 1:val = Random.Range(60, 80);break;case 2:val = Random.Range(45, 60);break;default:val = 40;break;}if(start){count++;if (count >= val)    //val帧一个飞碟{count = 0;if(DF == null){Debug.LogWarning("DF is NUll!");return;}producedDiskNum++;Disk d = DF.GetDisk(round);Manager.MoveDisk(d);if (producedDiskNum == 20) //20个飞碟进入下一个回合{round++;producedDiskNum = 0;}}}}public void LoadResources(){}public void Hit(Vector3 pos){Ray ray = Camera.main.ScreenPointToRay(pos);RaycastHit[] hits;hits = Physics.RaycastAll(ray);for (int i = 0; i < hits.Length; i++){RaycastHit hit = hits[i];//根据颜色加分if (hit.collider.gameObject.GetComponent<Disk>() != null){Color c = hit.collider.gameObject.GetComponent<Renderer>().material.color;if (c == Color.yellow) score += 1;if (c == Color.red) score += 2;if (c == Color.black) score += 3;// score += hit.collider.gameObject.GetComponent<Disk>().score;    //不清楚为什么这样分数是0.。。//把y更改到阈值以下,工厂会判断为freehit.collider.gameObject.transform.position = new Vector3(0, -5, 0);}}}public int GetScore(){return score;}//初始化各变量public void Restart(){score = 0;round = 1;start = true;}//到了第三回合要判断是否结束public bool RoundStop(){if (round > 3){start = false;return Manager.IsAllFinished();//是否还有飞碟留在used列表里}else return false;}public int GetRound(){return round;}
}

其他的代码没有什么改动


总结

本次代码为物体添加了刚体组件,让物体自己动起来。因为添加了刚体,如果屏幕上的飞碟太多有可能会碰撞,上一次代码会直接传过去。

Github传送门

Unity: 打飞碟Adapter版相关推荐

  1. 基于unity的2D横版游戏开发日志 小结

    前言 说是基于unity的2D横版游戏,实际上只是一个初学unity与C#新人的练手Demo,目前还处于半成状态.美术资源方面全部出自unity免费资源,经过自己的小修,大致拼出了一个游戏.代码方面, ...

  2. 高端游戏开发工具:Unity Pro 2019 Mac版

    Unity Pro 2019 for Mac是专业的游戏开发工具,unity pro 2019 mac版具备最先进的游戏引擎之一,新版本提供了模块化组件系统.着色器可视化编程工具.可视乎开发环境.渲染 ...

  3. Unity游戏优化[第二版]学习记录6

    以下内容是根据Unity 2020.1.01f版本进行编写的 Unity游戏优化[第二版]学习记录6 第6章 动态图形 一.管线渲染 1.GPU前端 2.GPU后端 3.光照和阴影 4.多线程渲染 5 ...

  4. Unity 2017.1正式版内容介绍

    Unity 2017.1正式版现已发布,这也标志着Unity 2017产品周期的开始,将全球最受欢迎的游戏引擎变成不断壮大的游戏与实时互动娱乐内容创作平台,专注于帮助各型团队改善工作流程并获得成功. ...

  5. Unity 2017.1正式版发布

    Unity 2017.1正式版现已发布,这也标志着Unity 2017产品周期的开始,将全球最受欢迎的游戏引擎变成不断壮大的游戏与实时互动娱乐内容创作平台,专注于帮助各型团队改善工作流程并获得成功. ...

  6. Unity游戏优化[第二版]学习记录4

    Unity游戏优化[第二版]学习记录4 第4章 着手处理艺术资源 一.音频 1.导入音频文件 2.加载音频文件 3.编码格式与品质级别 4. 音频性能增强 二.纹理文件 1.纹理压缩格式 2.纹理性能 ...

  7. Unity 5.6正式版发布,Unity 2017即将来临

    最新版Unity 5.6正式发布,也是Unity 5.x系列的最后一个版本.其中包括改进的2D功能,更好的图形性能,新的视频播放器,Progressive Lightmapper预览版,新的光照模式, ...

  8. Unity -- Animation(旧版动画组件)和Animator(新版动画器组件)

    旧版animation动画器组件 如果想让一个游戏物体具有动画表现的话,我们需要给这个游戏物体挂载动画组件 和音频组件视频组件一样,如果想在游戏对象上播放动画效果的话我们需要挂载一个动画组件,然后再给 ...

  9. Unity街机横版格斗(恐龙快打)插件-Beat Em Up Template 3D 1.3(附下载连接)

    导入插件后打开Game场景可看到自带的Demo场景的结构是非常简洁的,就设置几个东西就可以做成爽爆的打击感强烈的横版格斗游戏,小时候很喜欢玩<恐龙快打>,经常会幻想自己设置游戏关卡的话会怎 ...

  10. 如何通过Unity Hub下载f版的Unity

    国内Hub默认是c版的,这个无可厚非,对于国内开发者来说也更方便,但我不是开发,我是测试,我得和开发的unity环境保持一致,所以有了这篇文章. 简单来说就是直接:unityhub://2020.3. ...

最新文章

  1. pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(not contain in list)
  2. mysql算法函数_mysql中的函数总结
  3. poj 2034 Anti-prime Sequences(dfs)
  4. mysql数据库被黑客删除,您做好防范了吗?
  5. Android动画模式
  6. 什么是word2vector
  7. mysql 服务器 utf8_MySQL编码设置方法 MySQL编码为utf8设置方法
  8. ES6-04:函数的扩展
  9. base64 img图片按父div等比例显示
  10. Google Java编程规范
  11. 简单了解芯片封装技术
  12. 《稀缺》塞德希尔·穆来纳森 / 埃尔德·沙菲尔
  13. 南京大学计算机系住宿环境,请问有没有人知道南京大学计算机系大四学生在哪个校区?...
  14. 十二载征程犹未止,看今朝星光尽闪耀丨万字长文回顾2023数据技术嘉年华
  15. 东瓜小知识之《简单查询网卡的厂商信息》
  16. IMP-00008错误
  17. 【数值分析×机器学习】以SVD的分解形式进行深度神经网络的训练(逐渐熟练)
  18. iphone软件破解教程(工具篇)
  19. 计算机系统脱机,WinXP电脑脱机状态怎么解除?
  20. 证件照怎么改kb大小?这两种方法分分钟解决

热门文章

  1. 1. javascript 引擎Rhino源代码分析 简介
  2. android设计简单计算器代码下载,简单计算器实例
  3. 【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写
  4. 四维图新地图坐标_移动端地图技术分享
  5. word特殊符号汇总
  6. word中的符号无法添加(窗口变成灰色)
  7. deeping(linux)双系统windows启动界面花屏问题的完美解决。
  8. 视频中的字幕如何提取为文本
  9. 【linux学习笔记】红帽Linux 7.8系统在虚拟机上的安装
  10. 豆瓣高分JAVA书籍,你都读过吗?