上次偷了个懒没有写博客,这次一并带上
在这里主要是介绍一下基本的操作
创建飞碟使用的还是工厂模式,只不过这次我把飞碟工厂的类单列了出来
在这里一方面使用飞碟单体,同时还使用一个list来存储飞碟
这里面主要操作如下
- 获取当前状态下可用的飞碟(id以及实例)
在list中寻找可用的飞碟,如果没有的话就自己创建一个,返回的是飞碟在当前list中的编号
public int getDisk()
{
for (int i = 0; i < diskList.Count; i++)
{
if (diskList[i].activeInHierarchy == false)
{
return i;
}
}
diskList.Add(GameObject.Instantiate(diskTemplate) as GameObject);
return diskList.Count - 1;
}
下面这个是直接返回可用的物体
public GameObject getDiskObject(int id)
{
if(id < 0|| id >= diskList.Count)
{
return null;
}
else
{
return diskList[id];
}
}
- 回收飞碟
public void free(int id)
{
if (id > -1 && id < diskList.Count)
{
diskList[id].GetComponent<Rigidbody>().velocity = Vector3.zero;
diskList[id].transform.localScale = diskTemplate.transform.localScale;
diskList[id].SetActive(false);
}
}
接下来对游戏场景进行一个基本的建模
主要操作还是发射以及回收飞碟
- 发射飞碟
void emitDisks()
{
for (int i = 0; i < emitnumber; i++)
{
diskIds.Add(DiskFactory.getInstance().getDisk());
disks.Add(DiskFactory.getInstance().getDiskObject(diskIds[i]));
disks[i].GetComponent<Renderer>().material.color = diskColor;
disks[i].transform.position = new Vector3(emitposition.x, emitposition.y, emitposition.z);
disks[i].GetComponent<Rigidbody>().AddForce(emitdirection * Random.Range(emitspeed*0.5f, emitspeed), ForceMode.Impulse);
disks[i].SetActive(true);
}
}
- 回收飞碟
这里也是建立在前面工厂的飞碟回收函数之上的
void freeDisk(int i)
{
DiskFactory.getInstance().free(diskIds[i]);
disks.RemoveAt(i);
diskIds.RemoveAt(i);
}
以及在这里还借鉴了一些技巧:设置当前飞碟的状态
飞碟的状态可能是正在倒计时/正在发射/空闲
我们可以从中将飞碟调整到准备发射的状态
public void prepareToEmitDisk()
{
if (!timing && !shooting)
{
timeEmit = timedown;
emitenable = true;
}
}
飞碟如果没在倒计时,或者没在发射
就把它标记为准备发射状态,设置好准备时间,然后将emitenable(标记当前飞碟是否可以发射)调节为true
接下来还需要记分,关于分数的变化大抵有两种,击中(得分)/没击中(失败)
当然在得分的时候还要注意分数,如果达到标准可以进入下一关就直接进入下一关
public void score()
{
scene.setPoint(scene.getPoint() + oneDiskScore);
if (scene.getPoint() == disksToWin * oneDiskScore)
{
scene.nextRound();
}
}
public void fail()
{
scene.setPoint(scene.getPoint() - oneDiskFail);
}
这次作业还有个要求是让物体支持物理运动
在这里面,先将物体设置成刚体Rigidbody
对于物理运动,在这里使用的最多的是Addforce()函数
下面简单介绍一下这个函数
这个函数的全名是rigidbody.AddForce(x,y,z)
其中(x,y,z)表示一个力,三个参数分别代表了向x,y,z方向施加的力的大小
通过把这个力添加到物体上来实现物体的移动