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

本文介绍了一个3D打飞碟游戏的实现过程,包含多个round和trial,飞碟属性随机变化,游戏难度逐渐提升。采用带缓存的工厂模式管理飞碟,使用MVC结构实现交互与模型分离。详细阐述了游戏文件结构、各c#文件功能,并涉及资源管理和分数计算规则。
摘要由CSDN通过智能技术生成

视频演示

编写一个简单的鼠标打飞碟(Hit UFO)游戏

游戏内容要求

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

    游戏的要求

  • 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!

  • 尽可能使用前面 MVC 结构实现人机交互与游戏模型分离

游戏实现

总的来说,这次代码写的比较随意,冗余部分过多,而且没有很好的组织结构,函数的布置相对来说有点混乱,所以为了弥补这方面的不足,尽量做了好看的效果,加了一点粒子系统,当然也是参考了往届的博客。

文件结构

文本结构

文件结构

资源结构

资源结构

预制结构

预制结构

c#文件

DiskFactory

单例模式,得到飞碟id,得到飞碟对象,释放飞碟对象,为了避免开销大的问题,没有用destory,而是设置为diskList[id].SetActive(false);

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class DiskFactory : System.Object
{
    private static DiskFactory _instance;
    private static List<GameObject> diskList; 
    public GameObject disk;      

    public static DiskFactory getInstance()
    {
        if (_instance == null)
        {
            _instance = new DiskFactory();
            diskList = new List<GameObject>();
        }
        return _instance;
    }

    public int getDiskId()
    {
        for (int i = 0; i < diskList.Count; ++i)
        {
            if (!diskList[i].activeInHierarchy)
            {
                return i;
            }
        }
        diskList.Add(GameObject.Instantiate(disk) 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].GetComponent<Rigidbody>().velocity = Vector3.zero;
            //diskList[id].rigidbody.velocity = Vector3.zero;

            diskList[id].transform.localScale = disk.transform.localScale;
            diskList[id].SetActive(false);
        }
    }
}
DiskFactoryController

初始化disk,这次程序中的所有初始化,都是在类中声明为public,然后将预制拖到文件当中,而没有用Instantiate函数,感觉这样比较符合我的编程习惯。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DiskFactoryController : MonoBehaviour
{
    public GameObject disk;

    void Awake()
    {
        DiskFactory.getInstance().disk = disk;
    }
}
FirstController

包括场景的设置,发射飞碟的提示,发射飞碟,释放飞碟,得分。

  • 发射飞碟,大小,颜色,位置,方向都是随机的,但是没有与分数挂钩,都是打中一个得十分,每回合打完第十次进入下一回合,打完三回合,结束游戏。
  • FixedUpdate中用timeToNextEmission -= Time.deltaTime实现倒计时。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class FirstController : MonoBehaviour
{
    public Color[] TotalColor = {Color.black,Color.blue,Color.cyan,Color.green,Color.grey,Color.red,Color.yellow };
    public float EmissionDelay = 1f;
    public float timeToNextEmission;
    private bool isCounting;
    private bool isShooting;
    public bool getIsCounting() { return isCounting; }
    public bool getIsShooting() { return isShooting; }

    private List<GameObject> disks = new List<GameObject>();   
    private List<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值