Unity3D-鼠标打飞碟

本文介绍了使用Unity3D开发的一款鼠标打飞碟游戏,包括游戏规则、UML图和详细的游戏开发过程。游戏分为多个回合,每个回合有固定的射击机会,用户需在飞碟落地前击中所有飞碟以进入下一关。通过单例模式的场景控制器管理游戏状态,记分员负责计分和关卡推进,飞碟管理者控制飞碟发射与碰撞检测。文章还涉及接口设计、记分系统和飞碟工厂模式的实现。完整源码可在GitHub找到。
摘要由CSDN通过智能技术生成

游戏规则

  1. 游戏包括了n个round(回合),每个回合有十次trial。
  2. 通过按空格开始每个trial,同时会发射飞碟(UFO),发射飞碟的数量会逐渐递增,为了减低游戏难度我把发射飞碟的数量限制为最多3个(因为自己体验的时候发现5个的话要全命中难度较大)。颜色/角度/速度均随机产生。
  3. 用户在每一个trial必须在飞碟落地前击毙所有UFO才能成功进入下一个trial,当通关十个trial的时候会自动进入下一轮。
  4. 用户每击中一个飞碟加100分,但如果无法通过trail会使分数清0。

游戏设计

UML图

飞碟游戏UML

游戏开发

接口

这里IUserAction接口定义了与用户交互相关的动作,用户可以通过按下空格发射飞碟,也可以点击鼠标打飞碟。而IGameStatusOp接口定义了与游戏状态相关的工作,由场记(SceneController)控制。

public interface IUserAction
    {
        void launchUFO();
        void hitUFO(Vector3 mousePos);
    }

    public interface IGameStatusOp
    {
        int getRoundNum();
        void addScore();
        void subScore();
    }

具体的用户接口实现如下:

public class UserInterface : MonoBehaviour {
    private IUserAction action;

    // Use this for initialization
    void Start () {
        action = SceneController.getInstance() as IUserAction;
    }

    // Update is called once per frame
    void Update () {
        //检测鼠标点击
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 mousePos = Input.mousePosition;
            action.hitUFO(mousePos);
        }
        //检测用户按下空格
        if (Input.GetKeyDown(KeyCode.Space))
        {
            action.launchUFO();
        }
    }
}

场记

场记采用了单例模式,这样在其他地方调用getInstance()获取到的就是同一个SceneController对象。不同于前面几个星期,游戏由导演、场记、动作管理员、演员构成;在这个打飞碟游戏中,场记(由于突然有钱)请来了记分员和飞碟管理者,当用户按下空格,场记监控到只需要大喊一声“嘿!飞碟管理者,大胆放出你的飞碟吧~~”,具体怎么发射飞碟由飞碟管理者控制,场记就可以躺下来好好休息了~当然,记分相关的工作也都分发给了记分员,有钱真好~

public class SceneController : System.Object, IUserAction, IGameStatusOp
    {
        private static SceneController instance;    //单例模式
        private UFOController myUFOCtrl;          //飞碟管理者
        private StatusController myStatusCtrl;        //记分员

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

        internal void setUFOController(UFOController ufoCtrl)
        {
            if (myUFOCtrl == null) myUFOCtrl = ufoCtrl;
        }

        internal void setStatusController(StatusController gameStatus)
        {
            if (myStatusCtrl == null) myStatusCtrl = gameStatus;
;        }

        //记分员负责的工作
        public void addScore()
        {
            myStatusCtrl.addScore();
        }

       
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值