Unity完全自制游戏纸箱战争项目记录(20180630)

发表于2018-06-30
评论5 5.7k浏览

今天是周六,依然进行了部分的制作,昨天采用了更为优化的爆炸方块替换效果,但对性能还是有不小的影响,昨天在临走之前听老师说可以使用遮挡剔除尝试一下,今天就研究了研究,经过查阅资料,实现了遮挡剔除的功能。

具体实现步骤是把需要进行遮挡剔除的方块在静态选项中勾选上Occluder StaticOccludee Static,在遮挡剔除面板中进行烘焙即可,使用起来很方便,在使用后就产生了如下的效果。

绿色区域为摄像机的可视区域,在可视区域以外的方块都不进行渲染,有效的提高了游戏运行效率。

新的问题随之产生了,因为游戏中需要切换载具,我发现在切换载具的时候,因为摄像机的变动,遮挡剔除似乎失效了,遮挡剔除似乎只能作用在一个摄像机上,这点问题存疑,还没有得到有效的解决办法。

因为地块崩开之后需要在一定的时间内删除,在Unity中即使物体被删除了仍然会在内存中占有一定的资源,想到利用对象池来解决这个问题,经查阅资料后,发现对象池并不适用与我设想中的地形崩坏,具体还得再次的考量考量

另外还写了一个通用的炸弹脚本,在游戏中所有的炸弹都可以用到,避免了再每个炸弹上单独挂载脚本的繁琐性。

 

using UnityEngine;

using System.Collections;

 

public class BoomScirpt : MonoBehaviour

    //炸弹引爆时间

    public float BoomTime = 0;

    //炸弹爆炸产生伤害

    public int BoomHitHP = 200;

    //炸弹爆炸力量

    public float BoomPower = 2000.0f;

    //炸弹爆炸半径

    public float BoomRad = 5.0f;

    //炸弹爆炸掀起高度

    public float BoomUpPower = 500.0f;

    //炸弹是否允许多次爆炸

    public bool BoomRefresh = true;

    //炸弹是否可以对人体造成伤害

    public bool BoomDestructionHuman = true;

    //炸弹是否可以对载具造成伤害

    public bool BoomDestructionCarrier = true;

    //炸弹是否可以对环境造成伤害

    public bool BoomDestructionEnvironmental = true;

    //炸弹是否可以对地形造成伤害

    public bool BoomDestructionTerrain = true;

    public float BoomDestructionTerrainTime = 10.0f;

         void Start ()

    {

        StartCoroutine("BoomStartTime");

         }

        

         void Update ()

    {

        //测试功能

             if (Input.GetKeyDown(KeyCode.Q))

             {

           

            StartCoroutine("BoomStartTime");

             }

         }

    IEnumerator BoomStartTime()

    {

        yield return new WaitForSeconds(BoomTime);

        Vector3 BoomPos = transform.position;

        Collider[] HitCollider = Physics.OverlapSphere(BoomPos, BoomRad);

        foreach (var HitGameObject in HitCollider)

        {

            if (BoomDestructionHuman)

            {

               

            }

            if (BoomDestructionCarrier)

            {

 

            }

            if (BoomDestructionEnvironmental)

            {

 

            }

            if (BoomDestructionTerrain)

            {

               

                if (HitGameObject.gameObject.tag=="BigTerrain")

                {

                    HitGameObject.GetComponent<TerrainHP>().HP = HitGameObject.GetComponent<TerrainHP>().HP - BoomHitHP;

                    Debug.Log("boom");

                }

                if (HitGameObject.gameObject.tag == "SmallTerrain")

                {

                    if (HitGameObject.GetComponent<Rigidbody>()==null)

                    {

                        HitGameObject.gameObject.AddComponent<Rigidbody>().AddExplosionForce(BoomPower,BoomPos,BoomRad,BoomUpPower);

                    }

                   

                    HitGameObject.gameObject.GetComponent<BoxCollider>().size=new Vector3(0.5f,0.5f,0.5f);

                    Destroy(HitGameObject.gameObject, BoomDestructionTerrainTime);

                }

            }

        }

        if (!BoomRefresh)

        {

            Destroy(gameObject);

        }

    }

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引