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

unity 射击游戏源码+文档解释 unity 射击游戏源码+文档解释,说的非常详细,想学的可以下载 立即下载

游戏规则:游戏有三个关卡,每个关卡有四次发射机会,每次发射的飞碟大小颜色速度方向位置都不同,有50分初始分,每打中一个加10分,掉落一个在地减10分,第一二关都是90分过关,第三关70分过关,第一关每次发射一个飞碟,第二关两个,第三关三个。空格发射飞碟,鼠标左键射击飞碟。如图(虽然UI还没怎么优化过,将就一下了,还有没有录第三关也是为了让gif短一点,因为上传的gif有内存限制):


下面进入正题,怎么制作呢?

回收与再利用:首先这种涉及到类似于子弹啊,雨滴等物体的游戏,这种资源最好能回收与再利用,这样就可以节约资源,省的一直创建新对象,别看创建一个对象对游戏影响不怎么大,在一些大型游戏中这是很重要的思想的,因为一个场景往往涉及到成千上万的这种小物体,如果每一个都要创建一遍才能用,会导致卡顿,速度跟不上。

工厂模式:物体的生成都由一个工厂管理,需要什么只需要跟工厂说出你要什么,它会自己实现生成给你,里面如何生成不用你操心,实际上也有抽象的意思。就像这次的游戏,我数据设置好了,预设也传给了工厂,所以在需要加载飞碟是,只用调用一个getDisk()就可以了,不需要操心怎么生成。当然回收与再利用也是在工厂中实现的,也就是回收仓库也是在工厂里。

射线碰撞:用鼠标点击屏幕,如何获取我所点到的物体以及我的鼠标坐标呢?就是用从摄像机中发射出射线,然后鼠标点的位置作为方向,这样就可以选中第一个被射击中的物体,同时也可以记录出鼠标所点位置。

下面是这游戏制作代码的架构图:



SceneController类:负责把各个类之间对接,作为内部设置与用户界面的连接。

GameModel类:管理飞碟的基础数据。

RoundController类:管理关卡数据,每一个关卡对应需要不同的飞碟数据,在这里会给飞碟根据不通关卡加载不同属性。

Recorder类:管理记录加分减分。

Userface类:管理用户界面以及界面逻辑。

DiskFactory类:利用传进来的飞碟预设根据需要生产飞碟存于仓库,回收与再利用飞碟。

下面是代码:

工厂类(看注释应该就能看懂):

public class DiskFactory : System.Object
    {
        private static DiskFactory _instance;
        private GameObject prefabs_disk;
        public static List<GameObject> used = new List<GameObject>();
        public static List<GameObject> unused = new List<GameObject>();
        public static DiskFactory getInstance()             //单例化工厂
        {
            if (_instance == null)
            {
                _instance = new DiskFactory();
            }
            return _instance;
        }
        public void SetObject(GameObject x)     //把预设传入工厂
        {
            prefabs_disk = x;
        }
        public GameObject getDisk() //提供从工厂获取飞碟的借口
        {
            GameObject t;
            if (unused.Count == 0)
                t = GameObject.Instantiate(prefabs_disk);
            else
            {
                t = unused[0];
                unused.Remove(t);
            }
            used.Add(t);
            return t;
        }
        public void free(GameObject t)  //提供从外界回收飞碟到工厂的接口
        {
            t.GetComponent<Rigidbody>().velocity = Vector3.zero;
            t.transform.localScale = prefabs_disk.transform.localScale;
            t.SetActive(false);
            used.Remove(t);
            unused.Add(t);
        }
    }

接下来是SceneController类,它的工作实际上就是把各个类的功能合并起来,需要什么功能就它就调用某个类的功能来实现:

public class SceneController : System.Object, IQuery, IUserInterface
    {
        private static SceneController _instance;
        private RoundController _RC;
        private GameModel _gameModel;
        private Recorder _Recorder;
        public static SceneController getInstance()         //单例化
        {
            if (_instance == null)
            {
                _instance = new SceneController();
            }
            return _instance;
        }
        public void setdisk(GameObject t)               //把飞碟预设传入工厂
        {
            DiskFactory.getInstance().SetObject(t);
        }
        public int getRound()
        {
            return _RC.round;
        }
        public int getScore()
        {
            return _Recorder.score;
        }
        public void setGameModel(GameModel obj) { _gameModel = obj; }
        internal GameModel getGameModel() { return _gameModel; }
        public void setRecorder(Recorder obj) { _Recorder = obj; }
        internal Recorder getRecorder() { return _Recorder; }
        public void setRoundController(RoundController obj) { _RC = obj; }
        internal RoundController getRoundController() { return _RC; }
        public void emitDisk() { _gameModel.emitReady(); }
        public bool isShooting() { return _gameModel.shooting; }
        public void nextRound(int i)            //进入下一关卡
        {
            if (i == 1 || i == 2)
            {
                _Recorder.reset();
                _RC.round++;
                _RC.loadRoundData();
            }
            else if (i == 0) _RC.round = 0;
        }
    }

两个用户与SceneController的接口(在SceneController实现):

public interface IUserInterface         //Scenecontroller与用户界面的接口
    {
        void emitDisk();
        void setdisk(GameObject t);
    }
    public interface IQuery         //Scenecontroller与用户界面的接口
    {
        bool isShooting();
        int getRound();
        int getScore();
    }

以上三个部分我都放在一个自定义的namespace里面(name_game);

Userface用户界面实现UI以及提供用户接口逻辑:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using name_game;
public class UserInterface : MonoBehaviour {
    public int changes = 4;         //发射机会
    public Text roundText;          //显示目前关卡数
    public Text scoreText;          //显示目前分数
    public Text mainText;          //主显示板,显示规则以及提示
    public Text changeText;         //显示目前剩余发射机会
    public Camera ca;
    private int states = 0;      //0为初始界面,1为规则界面,2为游戏中 
    private IUserInterface userInt;     // 用户接口  
    private IQuery queryInt;      // 查询接口  
    public GameObject disktem;
    public ParticleSystem _exposion;    //爆炸粒子
    void Start()
    {
        userInt = SceneController.getInstance() as IUserInterface;
        queryInt = SceneController.getInstance() as IQuery;
        _exposion = GameObject.Instantiate(_exposion) as ParticleSystem;
        changes = 4;
        states = 0;
        userInt.setdisk(disktem);
        mainText.text = "欢迎来到飞碟世界,请按空格进入游戏";
    }
    void Update()
    {
        if ((queryInt.getRound() == 1 || queryInt.getRound() == 2 )&& changes == 0 && !queryInt.isShooting()) //判断一二关的结果
        {
            if (queryInt.getScore() >= 90)
            {
                mainText.text = "You win!(空格进入下一关)";
                if (Input.GetKeyDown("space"))
                {
                    states = 1;
                    changes = 4;
                    SceneController.getInstance().nextRound(1);
                }
            }
            else
            {
                mainText.text = "You lose!(空格重新开始)";
                if (Input.GetKeyDown("space"))
                {
                    states = 0;
                    changes = 4;
                    SceneController.getInstance().nextRound(0);
                }
            }
        }
        if (queryInt.getRound() == 3 && changes == 0 && !queryInt.isShooting()) //判断第三关的结果
        {
            if (queryInt.getScore() >= 70) mainText.text = "You win!You have passed all arounds(空格重新开始游戏)";
            else mainText.text = "You lose!(空格重新开始)";
            if (Input.GetKeyDown("space"))
            {
                states = 0;
                changes = 4;
                SceneController.getInstance().nextRound(0);
            }
        }
        changeText.text = "Changes: " + changes.ToString();
        if (changes>0&&Input.GetKeyDown("space")) {
            if(states==0)
            {
                states = 1;
                if(queryInt.getRound()==0) SceneController.getInstance().nextRound(1);
                mainText.text = "你有50初始分,每一关有四次发射机会,每次发射射出的飞碟数量以及速度还有大小颜色都不同,每一轮发射中每一个飞碟掉落在地都会扣10分,打中一个加10分,第一二关90分以上过关第三关70分以上过关,空格发射飞碟,鼠标左键射击,请按空格进入第一关";
            } else if(states==1)
            {
                states = 2;
                mainText.text = "";
            } else if(states==2)            //这个状态下才能发射
            {
                if ((!queryInt.isShooting())&&changes!=0)
                {
                    userInt.emitDisk();
                    changes--;
                }
            }
        }
        if(queryInt.isShooting()&&Input.GetMouseButtonDown(0))      //判断是否射击中目标,并且实现爆炸粒子效果
        {
            Ray ray = ca.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit) && hit.collider.gameObject.tag == "disk")
            {
                _exposion.transform.position = hit.collider.gameObject.transform.position;
                _exposion.GetComponent<Renderer>().material.color = hit.collider.gameObject.GetComponent<Renderer>().material.color;
                _exposion.Play();
                hit.collider.gameObject.SetActive(false);
            }
        }
        roundText.text = "Round: " + queryInt.getRound().ToString();
        scoreText.text = "Score: " + queryInt.getScore().ToString();
    }
}

Recorder类:

public class Recorder : MonoBehaviour {
    public int score = 50;          //记录当前所得分数
    void Awake () {
        SceneController.getInstance().setRecorder(this);
    }
    public void scoreADisk()        //得分
    {
        score += 10;
    }
    public void reset()             //重置
    {
        score = 50;
    }
    public void failADisk()         // 失分  
    {
        score -= 10;
    }
}

RoundController类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using name_game;
public class RoundController : MonoBehaviour {
    private Color color;
    private Vector3 emitPos;
    private Vector3 emitDir;
    private float speed;
    public int round = 0;
    void Awake()
    {
        SceneController.getInstance().setRoundController(this);
    }
    void Start () {
        emitPos = new Vector3(0f, 5f, -6f);
        emitDir = new Vector3(10f, 15f, 70f);
        speed = 15;
    }
    public void loadRoundData()                 //加载每一关卡飞碟数据
    {
        if(round==1)
        {
            color = Color.black;
            SceneController.getInstance().getGameModel().setting(3, color, emitPos, emitDir.normalized, speed, 1);
        } else
            if(round==2)
        {
            color = Color.red;
            SceneController.getInstance().getGameModel().setting(2, color, emitPos, emitDir.normalized, speed, 2);
        } else if(round==3)
        {
            color = Color.green;
            SceneController.getInstance().getGameModel().setting(2, color, emitPos, emitDir.normalized, speed, 3);
        }
    }
}

GameModel类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using name_game;
public class GameModel : MonoBehaviour
{
    public bool shooting=false;             //标记飞碟飞行期间的状态
    private int diskScale;                  //飞碟大小
    private Color diskColor;                //飞碟颜色
    private Vector3 emitPosition;           // 发射位置  
    private Vector3 emitDirection;          // 发射方向  
    private float emitSpeed = 0;                // 发射速度  
    private int emitNumber;                 // 发射数量  
    private bool emitEnable;
    private List<GameObject> disksToEmit = new List<GameObject>();
    void Awake()
    {
        SceneController.getInstance().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 emitReady()             //判断是否可以发射
    {
        if (!shooting)
        {
            emitEnable = true;
        }
    }
    void emitDisks()                //从工厂生产或者取出飞碟并且装入实现发射逻辑
    {
        for (int i = 0; i < emitNumber; ++i)    //每一个飞碟发射前都随机一次方向和发射位置
        {
            disksToEmit.Add(DiskFactory.getInstance().getDisk());
            disksToEmit[i].transform.localScale *= diskScale;
            disksToEmit[i].GetComponent<Renderer>().material.color = diskColor;
            disksToEmit[i].transform.position = new Vector3(Random.Range(emitPosition.x-1f, emitPosition.x+1f), emitPosition.y, emitPosition.z);
            disksToEmit[i].SetActive(true);
            emitDirection = new Vector3(Random.Range(emitDirection.x-0.3f, emitDirection.x + 0.3f), emitDirection.y, emitDirection.z);
            disksToEmit[i].GetComponent<Rigidbody>().velocity = emitDirection * Random.Range(emitSpeed, emitSpeed+5f);
        }
    }
    void freeDisk(GameObject adisk)             //调用工厂来回收飞碟
    {
        DiskFactory.getInstance().free(adisk);
        disksToEmit.Remove(adisk);
    }


    void FixedUpdate()
    {
        if (emitEnable)
        {
            emitDisks(); // 发射飞碟  
            emitEnable = false;
            shooting = true;
        }
    }
    void Update()
    {
        for (int i = 0; i < disksToEmit.Count; ++i)         //实现判断是否射击中
        {
            if (!disksToEmit[i].activeInHierarchy)
            {  // 飞碟不在场景中  
                SceneController.getInstance().getRecorder().scoreADisk();  // 得分  
                freeDisk(disksToEmit[i]);
            }
            else if (disksToEmit[i].transform.position.y < 0)
            {    // 飞碟在场景中但落地  
                SceneController.getInstance().getRecorder().failADisk();   // 失分  
                freeDisk(disksToEmit[i]);
            }
        }
        if (disksToEmit.Count == 0)
        {
            shooting = false;
        }
    }
}

还有一点就是要给飞碟的预设就如刚体组件,在Add Component->physics->Rigidbody就可以了

Text的话可以create一个Canvas,在里面创建并且调整各个提示框的位置以及大小

粒子系统就直接create->Particle System创建,然后样式再根据自己需要调一下。这次的游戏就大功告成了~~~

Unity游戏源码射击游戏 Unity游戏源码射击游戏提取方式是百度网盘分享地址 立即下载

相关推荐

Unity3D射击游戏项目源码CS战地枪王FPS

要求Unity3d版本2017.4.3f1及以上 描述 游戏采用unity3d引擎制作,以第一人称现实视角呈现给玩家。清晰的城市街道、炫酷的枪械武器、强大的爆炸效果,无一不展现出战争的浩瀚与残酷。战场永远是智慧的战场。勇敢地测试。游戏还原了最真实的战争场景,360度全景体验枪林弹雨的洗礼,与死亡和恐惧作斗争,在热血与激情中体验一场酣畅淋漓的现代战争。 该项目使用Unity 2017。上手非常简单,您可以编辑自己的关卡设计独特的关卡! 特征 还原经典真实战场——经典FPS枪战玩法,还原最真实的3D战场,体验枪林弹雨的激烈战斗。 丰富终极武器搭配——数十种武器组合,打造最强个体。 独创Boss狩猎模式——丰富Boss设计,独自击杀战场Boss,力挽狂澜。 超过20种不同的枪支。 40 个困难级别 - 40 个普通难度级别 - 4 种困难的 Boss。 数十个不同的npc。 各类礼包。 商城系统,枪械系统,装备系统,人物系统,道具系统,货币系统。

枪战小游戏

printf("操作方法:\n玩家1 wasd控制移动,空格攻击 只能往右侧打子弹\n玩家2 数字小键盘4568控制移动,0攻击 只能往左侧打子弹\n");//此处暂时不管威力。

Ldxx603的博客 1225

Unity游戏项目源码 画风可爱的射击小游戏 完整版.zip

源码参考 欢迎下载

UNITY设计一款简单的3d射击小游戏(虚拟现实大作业)

UNITY设计一款简单的3d射击小游戏(虚拟现实大作业) 利用UNITY设计了一款简单的射击小游戏。玩家通过W,A,S,D四个方向键操纵主角人物进行移动,按下J发射子弹,按下P暂停游戏,按回车键重新开始游戏,同时有背景音乐和各种特效辅助游戏进行。 游戏中怪物会自动生成,并向着主角方向移动,碰到主角时游戏失败;在主角发射的子弹碰撞到怪物,或者两个怪物互相碰撞时,怪物会被消灭。 根据作业要求,使用了完整的地形与人物模型(素材来自UNITY商店),用户交互(WASD及J、P、回车等按键功能),预置件(怪物和

Already8888的博客 2万+

虚拟机Ubuntu连接USRP

笔记本通过网线连接USRP。

xiaozir的博客 2307

STM32G474+Simulink+HIL硬件在环仿真

硬件:STM32G474RET6(官方的NUCLEO板)软件:STM32Cube_FW_G4 V1.6.1芯片包;KeilMATLAB 2023B(本文已成功)STM32嵌入式支持包。

qq_44701116的博客 1780

【Unity】射击小游戏

鼠标控制人物旋转方向前言一、准备一些Object二、代码示例1.Player脚本2.PlayerController脚本3.Hierarchy面板总结 前言 演示 提示:以下是本篇文章正文内容,下面案例可供参考 一、准备一些Object 示例:准备Player,Plane,Obstacle 二、代码示例 1.Player脚本 代码如下(示例): /**************************************************** 文件:Player.cs 作者:HKZ

m0_46208939的博客 4960

手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表)

本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。

weixin_30879169的博客 526

unity 3d原创制作射击游戏(全完整版+安卓apk编译)

unity 3d 原创制作射击游戏,主要运用了3dmax和unity。涉及到了动画、c#、canvas、Panel、Text、Button、Image、RawImage、刚体等等等等的内容,编译了安卓apk的版本。

mackilo的博客 1万+

YOLOv8 WIOU

本文介绍了如何在YOLOv8中实现WIOU(Weighted Intersection over Union)的修改方法。主要修改了ultralytics/utils/metrics.py文件中的bbox_iou函数,新增了WIoU_Scale类,支持单调性FM v2、非单调性FM v3两种模式,并提供了动态调整的动量参数。修改后的函数支持多种IoU变体(GIoU、DIoU、CIoU等),通过数学公式实现了更精确的边界框回归损失计算,特别针对小目标检测场景进行了优化。该实现使用了PyTorch框架,包含完整

FJN110的博客 2048

[特殊字符] RK3588 平台上基于 Panfrost 的 Mesa 驱动编译全过程

摘要: 本文详细记录了在RK3588平台(Ubuntu 20.04 aarch64)上编译基于Panfrost的Mesa驱动的全过程。内容包括:1)系统依赖安装;2)libdrm编译;3)Mesa配置参数优化;4)LLVM 15与SPIRV工具链的安装方法;5)SPIRV-Tools版本问题的解决方案;6)最终编译命令及常见错误处理。关键点在于正确设置工具链路径(PKG_CONFIG_PATH)和版本匹配(LLVM 15对应SPIRV-LLVM-Translator v15.0.0),推荐将组件安装在/op

梁俊星的博客 941

unity3d的第一人称射箭小游戏

第一人称射箭小游戏是基于unity3d编写的小游戏。玩家视角为一个弓弩,通过鼠标操控弓弩的视角方向,同时通过键盘的上下左右键或者“wasd”键来控制弓弩的移动方向。地图中有一个初始位置和两个靶场,玩家一开始降临在初始位置,按下1键进入静态靶场,里面有两种靶子,一大一小,共8个。按下2键进入动态靶场,里面同样有两种靶子,一种运动速度较快、变化多,一种运动速度较慢,且为直线运动。

tck333的博客 4812

红队内网攻防渗透:内网渗透之内网对抗:实战项目&VPC1打靶&PHP-RCE&三层代理路由&防火墙上线&密码喷射&域控提权

上面已经抓取到了密码,但是我们通过拓扑分析看,要想上线win10只能通过正向shell,因为win7的防火墙是开的,win10反向主动连接肯定入站规则拦截,而win10自己没有开防火墙,所以win7主动正向连接就可以上线。win7开启了防火墙,入站规则肯定是会拦截我们的请求的,所以我们需要反向上线,让win7主动来连接我们。这里扫描发现是存在ms17010漏洞的,但是想上线192.168.2.142的话,我们没有路由是上线不了的,这里有两种办法:一种msf直接生成后门,另一种cs移植后门到msf。

HACKONE的博客 909

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

游戏规则:          游戏分多个回合,每个回合有N个飞碟,玩家按空格后,321倒数3秒,飞碟飞出,点击鼠标,子弹飞出。飞碟落地或被击中,则准备下一次射击。每回合飞碟的大小、颜色、发射位置、发射角度、每次发射的数量可以变化。 游戏效果:         录了好几次,每次飞碟都打不中啊!_(:з」∠)_

Simba_Scorpio的专栏 6105

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1501

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程。源码内置详细搭建教程,感兴趣可自行下载。

百创科技 1713

用Unity3D实现打飞碟游戏

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

2301_79452545的博客 1590

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Unity实现打飞碟小游戏

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

m0_50547440的博客 1913

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

Chaos_Gravity的博客 358

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

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

ke1950523491的博客 454

unity3d实现简单的打飞碟游戏

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

sodifferent的博客 494

Unity3D学习之打飞碟游戏

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

Kiloveyousmile的博客 884

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

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

Khynnn的博客 689

my射飞碟小游戏

# 射飞碟游戏 # ### 具体要求如下: ### 假设有一支枪在摄像机位置(0,1,-10),在(0,0,0-10-20)放置三个小球作为距离标记,调整视角直到小球在下中部 将鼠标所在平面坐标,转换为子弹(球体)射出的角度方向。子弹使用物理引擎,初速度恒定。(U3d 坐标变换: http://www.cnblogs.com/tekkaman/p/3809409.html )

qq_33375026的博客 352

Unity3d游戏——打飞碟

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

m0_74106312的博客 753
上一篇: Unity3D:简单太阳系的制作
下一篇: Unity3D学习:飞碟游戏进化版
ChaosMeta
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值