3D游戏:打飞碟改进版

上次偷了个懒没有写博客,这次一并带上
在这里主要是介绍一下基本的操作
创建飞碟使用的还是工厂模式,只不过这次我把飞碟工厂的类单列了出来
在这里一方面使用飞碟单体,同时还使用一个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方向施加的力的大小
通过把这个力添加到物体上来实现物体的移动

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值