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。