Unity3d+moba+草丛视野

2023-08-24 13:26:09 浏览数 (2)

1 功能描述

类似lol中英雄躲草丛:

1.当我方单位(包括我)进入草丛,自己变为半透明,并且能探测到草丛中敌方单位。

2.当我方单位离开草丛,恢复不透明,如果草丛中有敌人,且该草丛中没有别的友军,丢失该敌军视野。

3.当敌方进入草丛,该草丛没有我方单位,敌方全透明,不能被外面我方单位探测到。

4.当敌方离开草丛,可以被探测到。

2 详细设计

草丛增加BoxCollider,触发选项勾上。单位增加BoxCollider,触发选项勾上,并且增加刚体。草丛上绑定GrassCtrl脚本,通过OnTriggerEnter,OnTriggerExit检测到进出草丛的单位,并且把这些单位的保存在list中做统一处理。

上图所示,草地为白色cube模拟,敌人A躲在草丛中,即使在我的视野中(图中绿框),也不会被探测到。而友军A视野之内(图中红框)有敌人B,所以小地图上显示3个点(我,友军A,敌人B)。

代码语言:javascript复制
List<UnitCtrl> m_listWeUnit = new List<UnitCtrl>();//这个草丛中我方单位
    List<UnitCtrl> m_listOtherUnit = new List<UnitCtrl>();//敌方单位

GrassCtrl中的类成员,保存进入该草丛的我方单位和敌方单位。

2.1 单位进入草丛时

代码语言:javascript复制
public void OnTriggerEnter(Collider other)
    {
        UnitCtrl unit = other.GetComponentInParent<UnitCtrl>();
        unit.m_isInGrass = true;
        if (unit.m_camp == MainMgr.self.m_camp)
        {
            //加入我方阵营表
            m_listWeUnit.Add(unit);
            unit.transparentSet(true);

            foreach (var item in m_listOtherUnit)//探测草丛中活着的敌人
            {
                item.visibleSet(true);
                item.transparentSet(false);//即使是尸体也要更新状态
                item.m_viewCtrl.unitShowInMiniMap();//活着的敌人才能出现在小地图中
            }
        }
        else 
        {
            m_listOtherUnit.Add(unit);
            if (m_listWeUnit.Count > 0)//里面有友军,这个敌人只透明
            {
                unit.transparentSet(true);
            }
            else if (m_listWeUnit.Count == 0)//没有友军,消失在屏幕视野中
            {
                unit.visibleSet(false);
                unit.m_viewCtrl.unitHideInMinimap();
            }
        }
        
}

2.2单位离开草丛时

代码语言:javascript复制
public void OnTriggerExit(Collider other)
    {
        UnitCtrl unit = other.GetComponentInParent<UnitCtrl>();
        unit.m_isInGrass = false;
        if (unit.m_camp == MainMgr.self.m_camp)
        {
            m_listWeUnit.Remove(unit);

            if (m_listWeUnit.Count == 0)//草丛里没有友军,草丛中的敌人不可见
            {
                foreach (var item in m_listOtherUnit)
                {
                    item.visibleSet(false);
                    item.m_viewCtrl.unitHideInMinimap();
                }
            }
        }
        else
        {
            m_listOtherUnit.Remove(unit);
        }
        unit.transparentSet(false);
        unit.visibleSet(true);
}

3 运行情况

当我进入草丛中,探测到草丛中的敌方A,把它显示出来,并在小地图显示它icon。

0 人点赞