public void ClickPos(Vector2 pos) { Debug.Log("click pos:" + pos); Ray ray = Camera.main.ScreenPointToRay(pos); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log("Raycast:"); //测试 UnityEntity unit = UnityEntityManager.Instance.GetUnityEntityFromObject(hit.transform.gameObject); if (unit != null && unit != m_MyMainUnit) { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(false); m_TargetUnit.TargetShowRedCircle(false); } m_TargetUnit = unit; //m_TargetUnit.TargetShow(true); m_TargetUnit.TargetShowRedCircle(true); //Protomsg.CS_PlayerAttack msg1 = new Protomsg.CS_PlayerAttack(); //msg1.IDs.AddRange(m_MyControlUnit); //msg1.TargetUnitID = unit.ID; //MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerAttack", msg1); } //Debug.Log(hit.collider.gameObject); } }
float AttackSelectTargetDis = 8;//攻击目标选择范围 public void PressAttackBtn(int touchstate, Vector2 dir) { if (m_MyMainUnit == null) { return; } //AttackRange float showattackrange = AttackSelectTargetDis; if (m_MyMainUnit.AttackRange > showattackrange) { showattackrange = m_MyMainUnit.AttackRange; } if (touchstate == 1) { if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange); if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit); } } else { m_TargetUnit.TargetShow(false); m_TargetUnit.TargetShowRedCircle(false); if (UnityEntityManager.Instance.CheckIsEnemy(m_TargetUnit, m_MyMainUnit) == false) { m_TargetUnit = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange); if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit); } } //不在范围内都重新寻找 //如果是普通单位且不在寻找攻击范围内 则重新寻找最近单位 var dis = Vector2.Distance(new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y), new Vector2(m_TargetUnit.X, m_TargetUnit.Y)); if (showattackrange < dis) { m_TargetUnit = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange); if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit); } } else { //单位类型(1:英雄 2:普通单位 3:远古 4:boss) //如果不是大仇恨敌方单位 if (m_TargetUnit.IsBigUnit() == false) { var bigenemy = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange); if (bigenemy != null) { m_TargetUnit = bigenemy; } else { //不在攻击范围内 if (m_MyMainUnit.AttackRange < dis) { m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit); } } } } } if (m_TargetUnit == null) { return; } m_TargetUnit.TargetShow(true); m_TargetUnit.TargetShowRedCircle(true); m_MyMainUnit.ShowSkillAreaLookAt(true, new Vector2(m_TargetUnit.X, m_TargetUnit.Y)); m_MyMainUnit.ShowOutCircle(true, showattackrange); } else if (touchstate == 2) { var target = UnityEntityManager.Instance.GetMinAngleEnemy(m_MyMainUnit, dir, showattackrange); if (target != null) { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(false); m_TargetUnit.TargetShowRedCircle(false); } m_TargetUnit = target; m_TargetUnit.TargetShow(true); m_TargetUnit.TargetShowRedCircle(true); var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * showattackrange); //m_MyMainUnit.ShowSkillAreaLookAt(true, new Vector2(m_TargetUnit.X, m_TargetUnit.Y)); m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos); } else { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(true); m_TargetUnit.TargetShowRedCircle(true); var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * showattackrange); m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos); } } } else if (touchstate == 3) { if (m_TargetUnit == null) { return; } Protomsg.CS_PlayerAttack msg1 = new Protomsg.CS_PlayerAttack(); msg1.IDs.AddRange(m_MyControlUnit); msg1.TargetUnitID = m_TargetUnit.ID; MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerAttack", msg1); NextAutoAttackTime = 1; //Debug.Log("PressAttackBtn"); m_TargetUnit.TargetShow(false); m_MyMainUnit.ShowOutCircle(false, 10); m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero); } return; }
public void PressSkillBtn(int touchstate, Vector2 dir, Protomsg.SkillDatas skilldata, bool isno, bool ismy) { if (m_MyMainUnit == null) { return; } float showattackrange = AttackSelectTargetDis; if (skilldata.CastRange > showattackrange) { showattackrange = skilldata.CastRange; } //CastTargetType 施法目标类型 1:自身为目标 2:以单位为目标 3:以地面1点为目标 //4:攻击时自动释放(攻击特效)5:以地面一点为方向 if (touchstate == 1) { //第一次选择目标 if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange); if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata); } } else { m_TargetUnit.TargetShow(false); m_TargetUnit.TargetShowRedCircle(false); if (UnityEntityManager.Instance.CheckCastSkillTarget(m_TargetUnit, m_MyMainUnit, skilldata) == false) { var target1 = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange); //m_TargetUnit = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange); if (target1 == null) { target1 = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata); } if (target1 != null) { m_TargetUnit = target1; } } //不在范围内都重新寻找 //如果是普通单位且不在寻找攻击范围内 则重新寻找最近单位 var dis = Vector2.Distance(new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y), new Vector2(m_TargetUnit.X, m_TargetUnit.Y)); if (showattackrange < dis) { m_TargetUnit = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange); if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata); } } else { //单位类型(1:英雄 2:普通单位 3:远古 4:boss) //如果不是大仇恨敌方单位 if (m_TargetUnit.IsBigUnit() == false) { var bigenemy = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange); if (bigenemy != null) { m_TargetUnit = bigenemy; } else { //不在攻击范围内 if (skilldata.CastRange < dis) { m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata); } } } } } switch (skilldata.CastTargetType) { case 4: Protomsg.CS_PlayerSkill msg4 = new Protomsg.CS_PlayerSkill(); msg4.ID = m_MyMainUnit.ID; msg4.TargetUnitID = 0; msg4.X = 0; msg4.Y = 0; msg4.SkillID = skilldata.TypeID; MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg4); break; case 1: if (skilldata.HurtRange > 0.1) { m_MyMainUnit.ShowOutCircle(true, skilldata.HurtRange); } break; case 2: if (m_TargetUnit == null) { m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata); if (m_TargetUnit == null) { return; } } m_TargetUnit.TargetShow(true); m_TargetUnit.TargetShowRedCircle(true); m_MyMainUnit.ShowSkillAreaLookAt(true, new Vector2(m_TargetUnit.X, m_TargetUnit.Y)); //m_MyMainUnit.ShowOutCircle(true, skilldata.CastRange); break; case 3: { var targetPos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y); if (m_TargetUnit != null) { targetPos = new Vector2(m_TargetUnit.X, m_TargetUnit.Y); } else { //进攻性技能 var skillclientitem = ExcelManager.Instance.GetSkillManager().GetSkillByID(skilldata.TypeID); if (skillclientitem != null) { //技能自动瞄准类型 1:普通 2:位移技能(朝目标方向最大距离) 3:进攻技能(瞄准敌人) if (skillclientitem.AutoAimType == 3) { var targetunit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit); if (targetunit != null) { targetPos = new Vector2(targetunit.X, targetunit.Y); } } else if (skillclientitem.AutoAimType == 2) { var targetDir = new Vector2(m_MyMainUnit.DirectionX, m_MyMainUnit.DirectionY); targetPos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (targetDir.normalized * skilldata.CastRange); } } } m_MyMainUnit.ShowInCircle(true, skilldata.HurtRange, new Vector3(targetPos.x - m_MyMainUnit.X, 0, targetPos.y - m_MyMainUnit.Y)); break; } case 5: { var targetDir = new Vector2(m_MyMainUnit.DirectionX, m_MyMainUnit.DirectionY); if (m_TargetUnit != null) { targetDir = new Vector2(m_TargetUnit.X - m_MyMainUnit.X, m_TargetUnit.Y - m_MyMainUnit.Y); } else { //进攻性技能 var skillclientitem = ExcelManager.Instance.GetSkillManager().GetSkillByID(skilldata.TypeID); if (skillclientitem != null) { //技能自动瞄准类型 1:普通 2:位移技能(朝目标方向最大距离) 3:进攻技能(瞄准敌人) if (skillclientitem.AutoAimType == 3) { var targetunit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit); if (targetunit != null) { targetDir = new Vector2(targetunit.X - m_MyMainUnit.X, targetunit.Y - m_MyMainUnit.Y); } } else if (skillclientitem.AutoAimType == 2) { } } } var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (targetDir.normalized * skilldata.CastRange); //m_MyMainUnit.ShowInCircle(true, 1, new Vector3(targetPos.x - m_MyMainUnit.X, 0, targetPos.y - m_MyMainUnit.Y)); m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos); break; } } if (skilldata.CastRange > 0.1) { m_MyMainUnit.ShowOutCircle(true, skilldata.CastRange); } } else if (touchstate == 2) { switch (skilldata.CastTargetType) { case 1: break; case 2: var target = UnityEntityManager.Instance.GetMinAngleUnitForSkillTarget(m_MyMainUnit, dir, skilldata); if (target != null) { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(false); m_TargetUnit.TargetShowRedCircle(false); } m_TargetUnit = target; m_TargetUnit.TargetShow(true); m_TargetUnit.TargetShowRedCircle(true); var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * skilldata.CastRange); m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos); } else { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(true); m_TargetUnit.TargetShowRedCircle(true); var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * skilldata.CastRange); m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos); } } break; case 3: { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(false); m_TargetUnit.TargetShowRedCircle(false); m_TargetUnit = null; } m_MyMainUnit.ShowInCircle(true, skilldata.HurtRange, new Vector3(dir.x, 0, dir.y)); } break; case 5: { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(false); m_TargetUnit.TargetShowRedCircle(false); m_TargetUnit = null; } var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * skilldata.CastRange); m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos); //m_MyMainUnit.ShowInCircle(true, 1, new Vector3(dir.x, 0, dir.y)); } break; } if (skilldata.CastRange > 0.1) { m_MyMainUnit.ShowOutCircle(true, skilldata.CastRange); } } else if (touchstate == 3) { if (isno == true) { if (m_TargetUnit != null) { m_TargetUnit.TargetShow(false); } m_MyMainUnit.ShowOutCircle(false, 10); m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero); m_MyMainUnit.ShowInCircle(false, 1, new Vector3(0, 0, 0)); return; } if (ismy == true) { Protomsg.CS_PlayerSkill msgmy = new Protomsg.CS_PlayerSkill(); msgmy.ID = m_MyMainUnit.ID; msgmy.TargetUnitID = m_MyMainUnit.ID; msgmy.X = 0; msgmy.Y = 0; msgmy.SkillID = skilldata.TypeID; MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msgmy); if (m_TargetUnit != null) { m_TargetUnit.TargetShow(false); } m_MyMainUnit.ShowOutCircle(false, 10); m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero); m_MyMainUnit.ShowInCircle(false, 1, new Vector3(0, 0, 0)); return; } switch (skilldata.CastTargetType) { case 1: Protomsg.CS_PlayerSkill msg2 = new Protomsg.CS_PlayerSkill(); msg2.ID = m_MyMainUnit.ID; msg2.TargetUnitID = 0; msg2.X = 0; msg2.Y = 0; msg2.SkillID = skilldata.TypeID; MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg2); m_MyMainUnit.ShowOutCircle(false, 10); Debug.Log("CS_PlayerSkill 1111"); break; case 2: if (m_TargetUnit == null) { return; } Protomsg.CS_PlayerSkill msg1 = new Protomsg.CS_PlayerSkill(); msg1.ID = m_MyMainUnit.ID; msg1.TargetUnitID = m_TargetUnit.ID; msg1.X = 0; msg1.Y = 0; msg1.SkillID = skilldata.TypeID; MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg1); Debug.Log("CS_PlayerSkill"); m_TargetUnit.TargetShow(false); m_MyMainUnit.ShowOutCircle(false, 10); m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero); break; case 3: { var targetPos = new Vector2(m_MyMainUnit.X + dir.x, m_MyMainUnit.Y + dir.y); if (m_TargetUnit != null) { targetPos = new Vector2(m_TargetUnit.X, m_TargetUnit.Y); } Protomsg.CS_PlayerSkill msg3 = new Protomsg.CS_PlayerSkill(); msg3.ID = m_MyMainUnit.ID; msg3.TargetUnitID = -1; //msg3.X = targetPos.x; //msg3.Y = targetPos.y; msg3.X = m_MyMainUnit.m_SkillAreaInCircleOffsetPos.x + m_MyMainUnit.X; msg3.Y = m_MyMainUnit.m_SkillAreaInCircleOffsetPos.z + m_MyMainUnit.Y; msg3.SkillID = skilldata.TypeID; MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg3); Debug.Log("CS_PlayerSkill"); m_MyMainUnit.ShowOutCircle(false, 10); m_MyMainUnit.ShowInCircle(false, skilldata.HurtRange, new Vector3(dir.x, 0, dir.y)); m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero); } break; case 5: { var targetPos = new Vector2(m_MyMainUnit.X + dir.x, m_MyMainUnit.Y + dir.y); if (m_TargetUnit != null) { targetPos = new Vector2(m_TargetUnit.X, m_TargetUnit.Y); } Protomsg.CS_PlayerSkill msg3 = new Protomsg.CS_PlayerSkill(); msg3.ID = m_MyMainUnit.ID; msg3.TargetUnitID = -1; //msg3.X = targetPos.x; //msg3.Y = targetPos.y; msg3.X = m_MyMainUnit.m_SkillAreaLookAtDir.x + m_MyMainUnit.X; msg3.Y = m_MyMainUnit.m_SkillAreaLookAtDir.z + m_MyMainUnit.Y; msg3.SkillID = skilldata.TypeID; MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg3); Debug.Log("CS_PlayerSkill"); m_MyMainUnit.ShowOutCircle(false, 10); m_MyMainUnit.ShowInCircle(false, 1, new Vector3(0, 0, 0)); m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero); } break; } } return; }