第六周 打飞碟

原创 2018年04月17日 16:51:13

第六周 打飞碟

参考代码:https://blog.csdn.net/c486c/article/details/79952255
具体代码:https://github.com/wtysos11/wty_3dGameProgramming/tree/Week6

程序基本框架

首先是沿用了上周所做的动作管理器与场景控制器的框架,然后使用单例工厂来对飞碟进行生产、回收来减少消耗。

规则设定

设定每一阶段打中飞碟的分数为:阶段数+1,并且规定没有打中飞碟分数减一。实现了ESC菜单,但是还没做出暂停。

具体代码

动作管理

使用特化的UFOManager类进行管理。
飞碟动作产生,产生多个随机位置,并最后让它们回到原点:

    public void ufoRandomMove(UFOObject ufo)
    {
        float moveSpeed = ufo.attr.speed;
        Vector3 currentPos = ufo.attr.originPosition;
        //注意修改
        Vector3 randomTarget1 = new Vector3(
            Random.Range(currentPos.x - 10, currentPos.x + 10),
            Random.Range(1, currentPos.y + 10),
            Random.Range(currentPos.z - 10, currentPos.z + 10)
            );
        LineAction moveAction1 = LineAction.GetBaseAction(randomTarget1, moveSpeed);//前往位置1

        //目标位置2
        Vector3 randomTarget2 = new Vector3(
            Random.Range(currentPos.x - 10, currentPos.x + 10),
            Random.Range(1, currentPos.y + 5),
            Random.Range(currentPos.z - 10, currentPos.z + 10)
            );

        LineAction moveAction2 = LineAction.GetBaseAction(randomTarget2, moveSpeed);//前往位置2

        //目标位置3
        Vector3 randomTarget3 = new Vector3(
            Random.Range(currentPos.x - 10, currentPos.x + 10),
            Random.Range(1, currentPos.y + 5),
            Random.Range(currentPos.z - 10, currentPos.z + 10)
            );

        LineAction moveAction3 = LineAction.GetBaseAction(randomTarget2, moveSpeed);//前往位置3

        Vector3 randomTarget4 = new Vector3(ufo.ufo.transform.position.x, ufo.ufo.transform.position.y, ufo.ufo.transform.position.z);

        LineAction moveAction4 = LineAction.GetBaseAction(randomTarget2, moveSpeed);//前往位置4
        SequenceAction sequenceAction = SequenceAction.GetBaseAction(-1, 0, new List<BaseAction> { moveAction1, moveAction2, moveAction3,moveAction4 });//制作SequenceAction
        addAction(ufo.ufo, sequenceAction, this);
    }

UFO管理

使用带缓存的工厂模式对UFO进行管理,由工厂统一创建和回收UFO。

public class UFOFactory : MonoBehaviour {
    Queue<UFOObject> freeQueue; //储存正在空闲时的UFO
    List<UFOObject> usingList;  //储存正在使用时的UFO
    private int totalNumber = 0;

    GameObject originalUFO;//UFO原型

    private static UFOFactory _instance;
    public static UFOFactory getInstance()
    {
        if(_instance == null)
        {
            _instance = new UFOFactory();

        }
        return _instance;
    }
    protected UFOFactory()
    {
        freeQueue = new Queue<UFOObject>();
        usingList = new List<UFOObject>();

        originalUFO = Object.Instantiate(Resources.Load("ufo", typeof(GameObject))) as GameObject;
        originalUFO.SetActive(false);
    }

    public UFOObject produceUFO(UFOAttr attr)
    {
        UFOObject newUFO;
        if(freeQueue.Count == 0)
        {
            GameObject newObj = GameObject.Instantiate(originalUFO);
            newUFO = new UFOObject(newObj);
            totalNumber++;
        }
        else
        {
            newUFO = freeQueue.Dequeue();
        }

        newUFO.setAttr(attr);
        usingList.Add(newUFO);
        newUFO.randomChange();
        newUFO.visible();
        return newUFO;
    }

    public void recycle(UFOObject ufo)
    {
        ufo.invisible();
        usingList.Remove(ufo);
        freeQueue.Enqueue(ufo);
    }

    public bool usingListEmpty()
    {
        if (usingList.Count == 0)
            return true;
        else
            return false;
    }
}

场景控制器

场景控制器与导演类与上次作业基本相同,飞碟击中与没有击中的判断和每个回合的判断都有场景控制器来决定。第一人称控制器也由场景控制器负责初始化。


public class FirstController : MonoBehaviour, ISceneController
{
    public UserInterface userInterface;
    public UFOActionManager actionManager;
    UFOFactory ufoFactory;
    Shoot shoot;
    bool roundStarted = false;
    public Score score;
    public DifficultyManager difficultyManager;
    void Awake()
    {
        //导演单例模式加载
        Director director = Director.getInstance();
        director.currentSceneController = this;
        userInterface = gameObject.AddComponent<UserInterface>() as UserInterface;
        actionManager = gameObject.AddComponent<UFOActionManager>() as UFOActionManager;
        ufoFactory = UFOFactory.getInstance();
        shoot = gameObject.AddComponent<Shoot>() as Shoot;
        difficultyManager = new DifficultyManager();
        score = new Score();
        this.LoadResources();
    }

    //ISceneController接口类,负责加载资源
    public void LoadResources()
    {
        new FirstCharacterController();
        GameObject terrain=GameObject.Instantiate(Resources.Load("Terrain")) as GameObject;
        terrain.name = "Terrain";
    }
    public void Start()
    {
        newRound();
    }

    //restart Button,可以后期再做
    public void restart()
    {
        List<UFOObject> list = ufoFactory.getUsingList();
        List<UFOObject> usingList = new List<UFOObject>();
        list.ForEach(i => usingList.Add(i));
        int ceil = usingList.Count;
        for(int i=0;i<ceil;i++)
        {
            Debug.Log(i + " " + ceil+" "+usingList.Count);
            UFOObject ufoObj = usingList[i];
            ufoFactory.recycle(ufoObj);
            actionManager.removeAction(ufoObj.ufo);
        }
        difficultyManager.clear();
        score.clear();
        newRound();

    }
    private void newRound()
    {
        roundStarted = true;
        UFOObject[] ufoObjects = new UFOObject[10];
        for(int i=0;i<10;i++)
        {
            ufoObjects[i] = ufoFactory.produceUFO(difficultyManager.getAttr());
            actionManager.ufoRandomMove(ufoObjects[i]);
        }

    }
    private void roundDone()
    {
        roundStarted = false;
        difficultyManager.levelUp();
        newRound();
    }

    //某个UFO对象被击中了
    public void UFOIsShot(UFOObject ufoObject)
    {
        actionManager.removeAction(ufoObject.ufo);
        ufoFactory.recycle(ufoObject);
        score.update();

        if(ufoFactory.usingListEmpty())
        {
            this.roundDone();
        }

    }
    public void ShotGround()
    {
        score.fail();
    }
}

射击对象

主要设计部分的控制对象。

public class Shoot : MonoBehaviour {
    public Camera camera;
    private FirstController firstController;

    private void Start()
    {
        camera = Camera.main;
        firstController = Director.getInstance().currentSceneController as FirstController;
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (firstController.userInterface.status == 0)
                firstController.userInterface.status = 1;
            else if (firstController.userInterface.status == 1)
                firstController.userInterface.status = 0;
        }

        if (firstController.userInterface.status == 1)
            return;

        //鼠标左键
        if(Input.GetButtonDown("Fire1"))
        {
            //Debug.Log("input mouse position:" + Input.mousePosition.ToString());
            Ray ray = camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit[] hits;
            hits = Physics.RaycastAll(ray);
            //Debug.Log("hits.Length" + hits.Length.ToString());
            for(int i=0;i<hits.Length;i++)
            {
                RaycastHit hit = hits[i];
                if(hit.transform.name=="Terrain")
                {
                    firstController.ShotGround();
                    return;
                }
                UFOObject ufoObject = hit.transform.GetComponent<UFORender>().ufoObj;
                if(ufoObject!=null)
                {
                    firstController.UFOIsShot(ufoObject);
                    return;
                }
            }
            //没有打中飞碟,扣分
            firstController.ShotGround();
        }

    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012837895/article/details/79977253

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

Unity3D 从入门到放弃(五)—–打飞碟填坑计划的万恶之源 写在开头: 本来感觉应该是不会写博客的,而且也不是很擅长写 博客。但在后来,突然醒悟到,博客这个东西,实际上并不是给别人看的(...
  • MyCodecOdecoDecodE
  • MyCodecOdecoDecodE
  • 2017-03-23 14:15:04
  • 443

Unity3D学习笔记(6)-- 打飞碟游戏改进版

一.简要说明 这是上一次打飞碟游戏的改进版本,这次和上次的版本有小些差异,在功能上主要添加了一个物理运动的模块,以下来讲讲这些改动。 二.游戏效果图 三.UML图 先上一张UML图 Physi...
  • x2_yt
  • x2_yt
  • 2017-04-03 21:37:12
  • 403

简单打飞碟游戏

一、鼠标点击小游戏         在写简单飞碟游戏之前,先写一个鼠标点击的小游戏热热身:游戏场景中会随机出现小圆圈,鼠标点击后,圆圈3秒后自动消失。      (1).  首先,创建Terrai...
  • pnxldzw
  • pnxldzw
  • 2016-05-30 15:36:03
  • 807

Unity3D学习(5)之工厂回收利用的3D版飞碟游戏

这一次我们来做的任务是3D版鼠标点击鼠标的游戏。我们先来看一下游戏需求。 案例研究:“鼠标打飞碟”游戏设计 游戏需求:     1. 分多个 round , 飞碟数量每个 round 都是 n ...
  • zzj051319
  • zzj051319
  • 2017-03-26 14:22:08
  • 900

unity打飞碟

unity hw4 1、编写一个简单的鼠标打飞碟(Hit UFO)游戏 游戏的演示视频地址:http://v.youku.com/v_show/id_XMzU0Mjg0NDg3Mg==.htm...
  • DDghsot
  • DDghsot
  • 2018-04-16 18:55:22
  • 42

Unity3D 重力下打飞碟

前言本次完成,虽然具体实现不同,代码结构上,很大程度参考了 。。。 ,所以复杂的东西也不写了,贴上代码以供自己以后使用;Diskfactory.cs这个cs文件主要控制了 飞碟的产生和使用using ...
  • qq_28057541
  • qq_28057541
  • 2016-04-15 17:15:12
  • 322

Unity笔记-打飞碟游戏

目的:创建一个打飞碟游戏(简陋)对于学渣来说,这个游戏并非那么容易。各个模块之间的联合本学渣认为还是比较强的。 游戏要求: 游戏要分多个 round , 飞碟数量每个 round 都是 n 个,但...
  • thatwall
  • thatwall
  • 2017-05-08 01:57:01
  • 224

Flash游戏制作--打飞碟

  • 2014年12月22日 14:13
  • 153KB
  • 下载

3D游戏编程4--打飞碟

编写一个简单的鼠标打飞碟(Hit UFO)游戏 游戏内容要求 游戏的要求 游戏实现 文件结构 c#文件 DiskFactory DiskFactoryController FirstControl...
  • yaoxh6
  • yaoxh6
  • 2018-04-13 20:53:26
  • 113

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

游戏规则:          游戏分多个回合,每个回合有N个飞碟,玩家按空格后,321倒数3秒,飞碟飞出,点击鼠标,子弹飞出。飞碟落地或被击中,则准备下一次射击。每回合飞碟的大小、颜色、发射位置、发射...
  • Simba_Scorpio
  • Simba_Scorpio
  • 2016-04-03 20:43:27
  • 3600
收藏助手
不良信息举报
您举报文章:第六周 打飞碟
举报原因:
原因补充:

(最多只允许输入30个字)