unity 砸飞碟游戏(附下载链接)
演示
每轮有10次Trial,每次Trial随机射出多个飞碟,飞碟会朝着一个方向边旋转边前进,飞碟的初始位置、朝向、角度、转动方向和颜色随机;左上角显示当前轮数和分数:
使用单例设计模式编写带有缓冲的飞碟工厂
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DiskFactory
{
protected static DiskFactory instance;
Queue freelist = new Queue();
RoundController controller;
public static DiskFactory Instance()
{
if (instance == null)
{
instance = new DiskFactory();
}
return instance;
}
public void SetController(RoundController controller)
{
this.controller = controller;
}
// 获取飞碟
public Disk GetDisk()
{
if (freelist.Count == 0)
{
// 如果freelist中没有剩余的飞碟则创建10个
for (int i = 0; i < 10; i++) {
GameObject obj = null;
switch (Random.Range(0, 4))
{
case 0:
obj = Object.Instantiate(Resources.Load<GameObject>("Prefabs/red_disk"));
break;
case 1:
obj = Object.Instantiate(Resources.Load<GameObject>("Prefabs/green_disk"));
break;
default:
obj = Object.Instantiate(Resources.Load<GameObject>("Prefabs/blue_disk"));
break;
}
Disk disk = new Disk(obj);
disk.DisActive();
ClickDisk click = obj.AddComponent(typeof(ClickDisk)) as ClickDisk;
click.disk = disk;
click.controller = controller;
freelist.Enqueue(disk);
}
}
Disk d = freelist.Dequeue();
d.Active();
return d;
}
// 释放飞碟
public void FreeDisk(Disk disk)
{
disk.DisActive();
freelist.Enqueue(disk);
}
}
飞碟类
public class Disk
{
public GameObject obj;
public Vector3 end; // 终点
public float speed; // 移动速度
public float rSpeed = 1; // 旋转速度
public bool died = false;
public Vector3 r; // 旋转角度
public Disk(GameObject obj)
{
this.obj = obj;
}
public void Init(Vector3 beg, Vector3 end, float speed, Quaternion q, Vector3 r)
{
this.obj.transform.position = beg;
this.end = end;
this.speed = speed;
this.obj.transform.rotation = q;
this.r = r;
}
public void Active()
{
this.died = false;
this.obj.SetActive(true);
}
public void DisActive()
{
this.died = true;
this.obj.SetActive(false);
}
public void Move()
{
if (died) return;
Vector3 deta = end - this.obj.transform.position;
Vector3 mv = deta.normalized * speed * Time.deltaTime;
obj.transform.Rotate(r * Time.deltaTime * rSpeed);
if (deta.magnitude < mv.magnitude)
{
this.died = true;
}
else
{
obj.transform.position = obj.transform.position + mv;
}
}
}