Unity3D学习笔记(6)—— 飞碟射击游戏

【Unity3D】打靶游戏 作业 阅读详情

游戏规则:

         游戏分多个回合,每个回合有N个飞碟,玩家按空格后,321倒数3秒,飞碟飞出,点击鼠标,子弹飞出。飞碟落地或被击中,则准备下一次射击。每回合飞碟的大小、颜色、发射位置、发射角度、每次发射的数量可以变化。

游戏效果:


        录了好几次,每次飞碟都打不中啊!_(:з」∠)_

游戏类图:


代码说明:

一、飞碟回收工厂类(DiskFactory)

        创建新的命名空间Com.Mygame,单例类DiskFactory和SceneController都定义其中。飞碟工厂类的目的是管理飞碟实例,同时对外屏蔽飞碟实例的的提取和回收细节,对于需要使用飞碟的其他对象,只能使用工厂类提供的3个函数,分别是getDisk()、getDiskObject()、free()。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Com.Mygame;

namespace Com.Mygame {
	public class DiskFactory : System.Object {
		private static DiskFactory _instance;
		private static List<GameObject> diskList;	// 飞碟队列
		public GameObject diskTemplate;				// 预设对象
			
		public static DiskFactory getInstance() {
			if (_instance == null) {
				_instance = new DiskFactory();
				diskList = new List<GameObject>();
			}
			return _instance;
		}

		// 获取可用飞碟id
		public int getDisk() { 
			for (int i = 0; i < diskList.Count; ++i) {
				if (!diskList[i].activeInHierarchy) {
					return i;	// 飞碟空闲
				}
			}
			// 无空闲飞碟,则实例新的飞碟预设
			diskList.Add(GameObject.Instantiate(diskTemplate) as GameObject);
			return diskList.Count-1;
		}

		// 获取飞碟对象
		public GameObject getDiskObject(int id) {
			if (id > -1 && id < diskList.Count) {
				return diskList[id];
			}
			return null;
		}

		// 回收飞碟
		public void free(int id) {
			if (id > -1 && id < diskList.Count) {
				// 重置飞碟速度
				diskList[id].rigidbody.velocity = Vector3.zero;
				// 重置飞碟大小
				diskList[id].transform.localScale = diskTemplate.transform.localScale;
				diskList[id].SetActive(false);
			}
		}
	}
}

public class DiskFactoryBC : MonoBehaviour {
	public GameObject disk;

	void Awake () {
		// 初始化预设对象
		DiskFactory.getInstance().diskTemplate = disk;
	}
}

有几点需要注意:

1)  当且仅当请求队列里的所有对象都在被使用(飞碟在场景中活跃)时,才会发生实例化,此时队列会变长。

2)  getDisk返回的是可用飞碟在队列里的index,这是为了方便free。

3)  free通过index找到飞碟在队列中的位置,并将飞碟设置为不活跃的。注意,由于飞碟使用了刚体组件,回收时需要把速度重置,并且大小可能会被改变,也应该重置。


二、用户界面类(UserInterface)

        用户界面有两大功能,一是处理用户键入,二是显示得分和倒计时等。用户键入有两种:鼠标左键和空格。左键发射子弹,空格发射飞碟。显示有三种:得分、回合和倒计时。

        子弹射击的思路:当用户点击鼠标时,从摄像机到鼠标创建一条射线,射线的方向即是子弹发射的方向,子弹采用刚体组件,因此发射子弹只需要给子弹施加一个力。子弹对象只有一个,下一次发射子弹时,必须改变子弹的位置(虽然有了刚体组件不建议修改transform,但也没有其它方法改变子弹位置了吧)。为了不让子弹继承上一次发射的速度,必须将子弹的速度归零重置。

        子弹的击中判断:采用射线而不是物理引擎,因为物理引擎在高速物体碰撞时经常不能百分百检测得到。

        发射飞碟的思路:调用用户接口。

        显示的思路:得分和回合直接通过查询接口获得。倒计时显示前通过查询接口判断是否正在倒计时,如果是,那么再通过查询接口获得倒计时时间。如果回合发生改变,则显示新的回合,直到用户按下空格。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using Com.Mygame;

public class UserInterface : MonoBehaviour {
	public Text mainText;	// 显示主提示:倒计时、新回合
	public Text scoreText;	// 显示得分 
	public Text roundText;	// 显示回合

	private int round;	// 当前回合

	public GameObject bullet;			// 子弹
	public ParticleSystem explosion;	// 爆炸粒子
	public float fireRate = .25f;		// 开枪间隔
	public float speed = 500f;			// 子弹速度
	
	private float nextFireTime;			// 下一次开枪时间

	private IUserInterface userInt;		// 用户接口
	private IQueryStatus queryInt;		// 查询接口

	void Start() {
		bullet = GameObject.Instantiate(bullet) as GameObject;
		explosion = GameObject.Instantiate(explosion) as ParticleSystem;
		userInt = SceneController.getInstance() as IUserInterface;
		queryInt = SceneController.getInstance() as IQueryStatus;
	}

	void Update () {
		if (queryInt.isCounting()) {
			// 显示倒计时
			mainText.text = ((int)queryInt.getEmitTime()).ToString();
		}
		else {
			if (Input.GetKeyDown("space")) {
				userInt.emitDisk();		// 发射飞碟
			}
			if (queryInt.isShooting()) {
				mainText.text = "";		// 射击开始,隐藏主提示
			}
			// 发射子弹
			if (queryInt.isShooting() && Input.GetMouseButtonDown(0) && Time.time > nextFireTime ) {
				nextFireTime = Time.time + fireRate;
				
				Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);	// 摄像机到鼠标射线
				bullet.rigidbody.velocity = Vector3.zero;						// 子弹刚体速度重置
				bullet.transform.position= transform.position;					// 子弹从摄像机位置射出
				bullet.rigidbody.AddForce(ray.direction*speed, ForceMode.Impulse);
				
				RaycastHit hit;
				if (Physics.Raycast(ray, out hit) && hit.collider.gameObject.tag == "Disk") {
					// 播放爆炸粒子特效
					explosion.transform.position = hit.collider.gameObject.transform.position;
					explosion.renderer.material.color = hit.collider.gameObject.renderer.material.color;
					explosion.Play();
					// 击中飞碟设置为不活跃,自动回收
					hit.collider.gameObject.SetActive(false);
				}
			}
		}
		roundText.text = "Round: " + queryInt.getRound().ToString();
		scoreText.text = "Score: " + queryInt.getPoint().ToString();
		// 如果回合更新,主提示显示新回合
		if (round != queryInt.getRound()) {
			round = queryInt.getRound();
			mainText.text = "Round " + round.ToString() + " !";
		}
	}
}

三、场景控制器类(SceneController)

        场景控制类主要实现接口定义和保存注入对象。另外它有两个私有变量round和point,分别记录游戏正在进行的回合,以及玩家目前的得分。

using UnityEngine;
using System.Collections;
using Com.Mygame;

namespace Com.Mygame {
	public interface IUserInterface {
		void emitDisk();
	}

	public interface IQueryStatus {
		bool isCounting();
		bool isShooting();
		int getRound();
		int getPoint();
		int getEmitTime();
	}

	public interface IJudgeEvent {
		void nextRound();
		void setPoint(int point);
	}

	public class SceneController : System.Object, IQueryStatus, IUserInterface, IJudgeEvent {
		private static SceneController _instance;
		private SceneControllerBC _baseCode;
		private GameModel _gameModel;
		private Judge _judge;

		private int _round;
		private int _point;

		public static SceneController getInstance() {
			if (_instance == null) {
				_instance = new SceneController();
			}
			return _instance;
		}

		public void setGameModel(GameModel obj) { _gameModel = obj; }
		internal GameModel getGameModel() { return _gameModel; }

		public void setJudge(Judge obj) { _judge = obj; }
		internal Judge getJudge() { return _judge; }

		public void setSceneControllerBC(SceneControllerBC obj) { _baseCode = obj; }
		internal SceneControllerBC getSceneControllerBC() { return _baseCode; }

		// 操作接口
		public void emitDisk() { _gameModel.prepareToEmitDisk(); }

		// 查询接口
		public bool isCounting() { return _gameModel.isCounting(); }
		public bool isShooting() { return _gameModel.isShooting(); }
		public int getRound() { return _round; }
		public int getPoint() { return _point; }
		public int getEmitTime() { return (int)_gameModel.timeToEmit + 1; }

		// 得分接口
		public void setPoint(int point) { _point = point; }
		public void nextRound() { _point = 0; _baseCode.loadRoundData(++_round); }
	}
}

四、关卡类(SceneControllerBC)

        关卡类保存了各个round飞碟的大小、颜色、发射位置、发射角度、发射数量等信息。它只有一个函数loadRoundData(),用来初始化游戏场景。

public class SceneControllerBC : MonoBehaviour {
	private Color color;
	private Vector3 emitPos;
	private Vector3 emitDir;
	private float speed;

	void Awake() {
		SceneController.getInstance().setSceneControllerBC(this);
	}

	public void loadRoundData(int round) {
		switch(round) {
		case 1:		// 第一关
			color = Color.green;
			emitPos = new Vector3(-2.5f, 0.2f, -5f);
			emitDir = new Vector3(24.5f, 40.0f, 67f);
			speed = 4;
			SceneController.getInstance().getGameModel().setting(1, color, emitPos, emitDir.normalized, speed, 1);
			break;
		case 2:		// 第二关
			color = Color.red;
			emitPos = new Vector3(2.5f, 0.2f, -5f);
			emitDir = new Vector3(-24.5f, 35.0f, 67f);
			speed = 4;
			SceneController.getInstance().getGameModel().setting(1, color, emitPos, emitDir.normalized, speed, 2);
			break;
		}
	}
}

五、游戏规则类(Judge)

        游戏规则单独作为一个类,有利于日后修改。这里需要处理的规则无非就两个,得分和失分。另外,得分需要判断是否能晋级下一关。能就调用接口函数nextRound()。

using UnityEngine;
using System.Collections;
using Com.Mygame;

public class Judge : MonoBehaviour {
	public int oneDiskScore = 10;
	public int oneDiskFail = 10;
	public int disksToWin = 4;

	private SceneController scene;

	void Awake() {
		scene = SceneController.getInstance();
		scene.setJudge(this);
	}

	void Start() {
		scene.nextRound();	// 默认开始第一关
	}

	// 击中飞碟得分
	public void scoreADisk() {
		scene.setPoint(scene.getPoint() + oneDiskScore);
		if (scene.getPoint() == disksToWin*oneDiskScore) {
			scene.nextRound();
		}
	}

	// 掉落飞碟失分
	public void failADisk() {
		scene.setPoint(scene.getPoint() - oneDiskFail);
	}
}

六、游戏场景类(GameModel)

        场景类是整个飞碟射击游戏的核心类,主要负责飞碟动作的处理。我是这样设计的:首先需要倒计时功能,可以通过几个整型变量和布尔变量完成。另外需要飞碟发射功能,通过setting函数保存好飞碟的发射信息,每次倒计时完成后,通过emitDisks获取飞碟对象,并通过发射信息初始化飞碟,再给飞碟一个力就可以发射了。而飞碟的回收在Update里完成,一种是飞碟被击中(飞碟不在场景中)了,需要调用Judge获得分数。另一种是飞碟在场景中,但是掉在地上了,需要调用Judge丢失分数。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Com.Mygame;

public class GameModel : MonoBehaviour {
	public float countDown = 3f;	// 飞碟发射倒计时总时间
	public float timeToEmit;		// 飞碟发射倒计时剩余时间
	private bool counting;			// 正在倒计时
	private bool shooting;			// 正在射击
	public bool isCounting() { return counting; }
	public bool isShooting() { return shooting; }

	private List<GameObject> disks = new List<GameObject>();	// 发射的飞碟对象列表
	private List<int> diskIds = new List<int>();				// 发射的飞碟id列表
	private int diskScale;					// 飞碟大小
	private Color diskColor;				// 飞碟颜色
	private Vector3 emitPosition;			// 发射位置
	private Vector3 emitDirection;			// 发射方向
	private float emitSpeed;				// 发射速度
	private int emitNumber;					// 发射数量
	private bool emitEnable;				// 允许新的发射事件

	private SceneController scene;

	void Awake () {
		scene = SceneController.getInstance();
		scene.setGameModel(this);
	}

	// 初始化场景
	public void setting(int scale, Color color, Vector3 emitPos, Vector3 emitDir, float speed, int num) {
		diskScale = scale;
		diskColor = color;
		emitPosition = emitPos;
		emitDirection = emitDir;
		emitSpeed = speed;
		emitNumber = num;
	}

	// 准备下一次发射
	public void prepareToEmitDisk() {
		if (!counting && !shooting) {
			timeToEmit = countDown;
			emitEnable = true;
		}
	}

	// 发射飞碟
	void emitDisks() {
		for (int i = 0; i < emitNumber; ++i) {
			diskIds.Add(DiskFactory.getInstance().getDisk());
			disks.Add(DiskFactory.getInstance().getDiskObject(diskIds[i]));
			disks[i].transform.localScale *= diskScale;
			disks[i].renderer.material.color = diskColor;
			disks[i].transform.position = new Vector3(emitPosition.x, emitPosition.y+i, emitPosition.z);
			disks[i].SetActive(true);
			disks[i].rigidbody.AddForce(emitDirection*Random.Range(emitSpeed*5, emitSpeed*10)/10, ForceMode.Impulse);
		}
	}

	// 回收飞碟
	void freeADisk(int i) {
		DiskFactory.getInstance().free(diskIds[i]);
		disks.RemoveAt(i);
		diskIds.RemoveAt(i);
	}

	void FixedUpdate() {
		if (timeToEmit > 0) {
			counting = true;
			timeToEmit -= Time.deltaTime;
		} else {
			counting = false;
			if (emitEnable) {
				emitDisks(); // 发射飞碟
				emitEnable = false;
				shooting = true;
			}
		}
	}
	
	void Update () {
		for (int i = 0; i < disks.Count; ++i) {
			if (!disks[i].activeInHierarchy) {	// 飞碟不在场景中
				scene.getJudge().scoreADisk();	// 得分
				freeADisk(i);
			}
			else if (disks[i].transform.position.y < 0) {	// 飞碟在场景中但落地
				scene.getJudge().failADisk();	// 失分
				freeADisk(i);
			}
		}
		if (disks.Count == 0) {
			shooting = false;
		}
	}
}

其他说明:

        场景中预置的所有对象:

一、摄像机

        可将所有脚本挂载在摄像机上。摄像机的参数:

二、预设

        子弹(Bullet):


        飞碟(Disk):


        粒子(Particle System):


        地板材质:

三、文字

        在场景编辑器里右键创建UI元素Text,调整 text 对齐位置和文字大小即可。


四、脚本设置

        最后,将5个脚本挂载在组摄像机上,将预设拖入相应的脚本中:

        OK!游戏完成了!

        我的制作顺序是这样子的,游戏开始的时候先不忙着写脚本,把预设弄好,包括摄像机角度,粒子效果等。写脚本先写子弹射击,然后写飞碟工厂,再写游戏场景,这时候就已经有了一个小Demo可以玩了。然后添加场景控制类,完善用户界面,使得可以显示回合和分数等信息。最后写关卡类和规则类。





Unity3D-鼠标打飞碟 游戏规则 游戏包括了n个round(回合),每个回合有十次trial。 通过按空格开始每个trial,同时会发射飞碟(UFO),发射飞碟的数量会逐渐递增,为了减低游戏难度我把发射飞碟的数量限制为最多3个(因为自己体验的时候发现5个的话要全命中难度较大)。颜色/角度/速度均随机产生。 用户在每一个trial必须在飞碟落地前击毙所有UFO才能成功进入下一个trial,当通关十个trial的时候会自... 阅读详情

相关推荐

多臂老虎机——入门强化学习

多臂老虎机(Multi-Armed Bandit,MAB)问题是强化学习的经典入门例子,也是理解探索与利用(exploration-exploitation)平衡的重要案例。

qq_56683019的博客 2458

unity实现简易3D游戏——打飞碟

飞碟游戏是一款经典的射击类游戏,玩家需要通过射击飞碟来获取分数,游戏的目标是尽可能地获得高分。以下是飞碟游戏的一般规则和玩法:1. 游戏目标:玩家通过射击飞碟来获得分数,目标是尽可能地获得高分。2. 飞碟类型:游戏中通常会有多种不同类型的飞碟,每种飞碟的分数和速度可能不同,玩家需要根据情况选择目标并进行射击。在本游戏中,一共有三种飞碟的类型,分别对应着不同的颜色和不同的分数。

Y2807593076的博客 2816

最详细的Cadence OrCAD Capture自带元件库的介绍

最详细的Cadence OrCAD Capture自带元件库的介绍 本章节将介绍Cadence OrCAD Capture 软件自带的各类元件库的分类,方便大家在设计时能够快速的选择元件。 AMPLIFIER.OLB 共182个零件,存放模拟放大器,IC,如LM386,MAX457等。 ARITHMETIC.OLB 共182个零件...

LGCPCB的博客 6万+

Unity3D学习笔记(5)-打飞碟游戏

游戏简介    这是一个简单的打飞碟游戏,总共有3个回合,每个回合都会出现N个颜色不同的飞碟,其中击中黄色飞碟得1分,击中红色飞碟得2分,击中黑色飞碟得四分, 而且这个游戏是没有结束的,这三个回合不断的重复。 游戏截图: 游戏配置说明: 游戏的摄像机设置如上 游戏类图 游戏源代码: 一.飞碟回收工厂类(DiskFact

x2_yt的博客 1982

DCDC BUCK开关电源PCB设计

在开关电源中,BUCK(降压)电路、BOOST(升压)电路以及BUCK - BOOST(升降压)三种电路是最基本的拓扑结构。转换器又分DCDC(直流转直流)和ACDC(交流转直流),DCDC装换器结构无疑是比ACDC转换器结构简单,所以从DCDC转换器结构入手学习开关电源是一种很好的选择。本文主要从应用角度,进行相关器件的选型计算以及PCB绘制讲解DCDC 12V转5Vbuck电路。

2301_78342510的博客 6883

3分钟搞懂欧式距离变换(EDT):从暴力算法到Felzenszwalb的演进史

本文系统梳理了欧式距离变换(EDT)从暴力算法到高效线性算法的演进历程。重点解析了光栅扫描算法和Felzenszwalb算法的核心思想与实现,并探讨了其在机器人路径规划中生成欧几里得符号距离场(ESDF)的关键应用,为开发者提供了清晰的算法选型与实战指南。

fern8的博客 976

Unity 3D——打飞碟游戏

游戏共有5个回合,每个回合中会有随机产生的飞碟飞过屏幕,玩家需要做的事情就是用鼠标尽量快和多地点击飞碟。每个飞碟对应一定的分数:【红色飞碟 3分】、【绿色飞碟 2分】、【蓝色飞碟 1分】游戏的目的是在规定回合内得到尽可能高的分数。游戏进行时点击屏幕中间按钮可以切换物体的运动模式(作用到下一个round)可以看出不同运动模式下的明显差别,物理模式下飞碟会相互碰撞。

zirconium95的博客 370

NVIDIA Isaac Sim 入门教程(一)

文档分为以下几个部分: 简介、安装指南、API 文档、教程、手册和参考资料。简介部分是对 Omniverse Isaac Sim 的基本概述,以及它如何融入 NVIDIA Omniverse™ 生态系统。它还概述了 Omniverse Isaac Sim 的架构、工作流程和文档布局。

机器人控制与仿真应用 1万+

Unity3D学习:射击小游戏——飞碟世界

飞碟小游戏

KingsonYing的博客 1871

【半导体工业实战】C#.NET开发SECS/GEM协议上位机(完整可运行源码+全进制转换工具类+工业级通信封装)

在半导体这个高精尖的工业领域,SECS/GEM协议是设备通信的基石,而C#.NET凭借其稳定性、高效的字节处理能力、Windows工控机的深度适配,成为SECS上位机开发的最优选择。本文从半导体行业的专属认知出发,提供了完整的进制转换工具类、工业级的SECS通信封装、实战的报文解析与业务调用示例、半导体专属的避坑指南,所有内容均为真实项目经验的沉淀,无空洞理论、无AI冗余文字,所有源码均可直接编译运行、无缝移植到半导体项目中。半导体工控开发的核心,从来不是炫技,而是。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 897

【C语言趣味教程】(0) 专栏介绍

这是一套C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出"有趣的干货" !本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录!标题前带星号 (*) 的部分不建议初学者阅读,因为内容难免会超出当前章节的知识点,面向的是对 C 语言有一定基础或已经学过

有道无术, 术尚可求。有术无道, 止于术。 2万+

unity2D中设置射击间隔之动画关键帧事件

unity2D中设置射击间隔之动画关键帧事件

CertainLan的博客 4401

Microsoft Dynamics 365软件二次开发:Dynamics365部署与版本控制策略

在Microsoft Dynamics 365中,自定义实体允许开发者扩展系统以满足特定业务需求。自定义实体可以包含字段、选项集、关系和其他属性,与标准实体类似,但完全由用户定义。1. 登录到Dynamics 365环境。2. 转到“解决方案”区域,选择“自定义”。3. 在“自定义”菜单中,选择“实体”。4. 点击“新建”,输入实体名称,例如“客户反馈”。5. 添加字段,如“反馈类型”、“反馈日期”、“描述”等。6. 设置主键和唯一标识符。7. 定义关系,如与“客户”实体的关联。

kkchenjj的博客 2208

用Unity3D实现打飞碟游戏

GetDisk()函数传入了一个ruler参数,实现了从free队列中取一个飞碟游戏对象,如果free中不存在,则再使用Instantiate()函数创建一个实例对象,并根据ruler,将实例对象的速度(speed)、大小(size)、颜色(color)设置成对应的参数,并设置其出现在页面上的相关参数,最后将其加入used队列中,表面其被使用。首先设置了一个Ruler结构体,来存储回合、机会、飞碟数目、大小、速度、颜色、位置等初始化和构造飞碟的基本参数,这些参数通过一个结构体来同一管理。

2301_79452545的博客 1590

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Unity实现打飞碟小游戏

Unity实现打飞碟小游戏 项目地址 演示视频 适配器模式概述 定义 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper),属于结构型模式。 为表述方便,定义: 需要被适配的类、接口、对象,简称 src(source) 最终需要的输出,简称 dst (destination,即Target) 适配器称之为 Adapter 。 一句话描述适配器模式的感觉: src->Adapter->d

m0_50547440的博客 1913

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

unity3d实现简单的打飞碟游戏

游戏内容 游戏有n个round,每个round发射10次trial,每个trial的飞碟都可能不同,包括速度角度得分等,使用鼠标进行射击,点中即表示射击成功。 游戏要求 使用带缓存的工厂模式来管理飞碟的生产与再利用,工厂使用单例模式。 游戏的设计 首先是设计一个制造飞碟的工厂 由于需要使用带缓存的工厂,所以使用两个list来储存正在使用的飞碟,与没有使用的飞碟。每次需要工厂输出一个飞碟的时候就去...

sodifferent的博客 494

Unity3d游戏——打飞碟

1.游戏有 4 个 round,每个 round 中玩家需要通过射击足够数量的飞碟达到积分要求以进入下一轮,倒计时结束前没有进入下一轮即为游戏失败,通过四轮后游戏成功。2.每个飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。3.round轮数越高,飞碟越快,总体难度随 round 上升。4.在游戏过程中可以通过暂停按钮暂停游戏。

m0_74106312的博客 753

【Unity3D】简单的鼠标打飞碟(Hit UFO)游戏

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

Khynnn的博客 689

Unity3D小游戏——Hit UFO(打飞碟)

游戏有 5 个 round,每个 round 都包括10 次 trial;每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。飞碟根据飞碟样式分别记为1-3分,分数越高,平均移动速度越快;每个 trial 的飞碟有随机性,总体难度随 round 上升,体现为增加所有样式飞碟的速度;鼠标点中飞碟即可得分,全部飞碟被击落或越界完成该 round;可以通过界面中下方的按钮来切换飞碟运动模式,分为运动学模式和物理模式,前者不存在碰撞与反弹,后者反之。

Chaos_Gravity的博客 358

Unity3d--改进飞碟游戏 作业6

3dgame 作业6 1. 作业内容 改进飞碟(Hit UFO)游戏: 游戏内容要求: 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 2. 游戏配置 游戏中共有三种飞碟,创建好三个飞碟的预制类。 在三个预制类中分别添加Disk脚本,并且设置好每个预制类的大小。 创建好三种飞碟不同的材质,并添加。 创建一个空对象,并将SceneCont...

qq_40135006的博客 435

Unity3d--简单的打飞碟游戏

3dgame 作业5 1. 作业内容 编写一个简单的鼠标打飞碟(Hit UFO)游戏 游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial; 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制; 每个 trial 的飞碟有随机性,总体难度随 round 上升; 鼠标点中得分,得分规...

qq_40135006的博客 484

Unity3d--飞碟游戏

一.游戏规则与要求 游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial; 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制; 每个 trial 的飞碟有随机性,总体难度随 round 上升; 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。 游戏的要求: ...

TempterCyn的博客 520

Unity3D学习之路Homework4—— 飞碟射击游戏

简单打飞碟小游戏 游戏规则与要求 规则 鼠标点击飞碟,即可获得分数,不同飞碟分数不一样,飞碟的初始位置与飞行速度随机,随着分数增加,游戏难度增加。初始时每个玩家都有6条生命,漏打飞碟扣除一条生命,直到生命为0游戏结束。 要求: 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类 近可能使用前面 MVC 结构实现人机交...

ke1950523491的博客 454

Unity3D学习之打飞碟游戏

对于打飞碟游戏来说,这次改进相对来说比较简单。说一下设计思路。对于飞碟的运动:运动学运动,有点类似牧师恶魔里面的过河;物理运动,则类似射箭小游戏的设计。所以,对于这两种动作分别实现即可。

Kiloveyousmile的博客 884

Unity3D 从入门到放弃(四)----打飞碟

Unity3D 从入门到放弃(五)—–打飞碟填坑计划的万恶之源 写在开头: 本来感觉应该是不会写博客的,而且也不是很擅长写 博客。但在后来,突然醒悟到,博客这个东西,实际上并不是给别人看的(感觉也不会有人看),更重要的,是给自己一个提示,一个记录。只有把原始森林中所有的危险地点全部都标记下来,下次来的时候才不会重蹈覆辙。 该说的就这么多,要赶紧填坑了。 打飞碟 程序规则:写个用鼠

MyCodecOdecoDecodE的博客 1140
上一篇: Unity3D学习笔记(5)—— 牧师和魔鬼游戏改进
下一篇: Unity3D学习笔记(7)—— 击球游戏
Simba_Scorpio
博客等级 码龄13年 53粉丝 16原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值