예제 #1
0
    public Actor[] FindTargets(long ownerID, Vector3 pos, float radius, TeamFlag teamFlag, TargetFlag targetFlag)
    {
        List <Actor> allActors = GetActorList();
        List <Actor> list      = new List <Actor>();

        foreach (var item in allActors)
        {
            if (item == this)
            {
                continue;
            }

            if (Vector3.Distance(pos, item.Position) > radius)
            {
                // 超出范围
                continue;
            }

            if (teamFlag == TeamFlag.ENEMY && item.UserID == ownerID)
            {
                // 要求目标是敌人
                continue;
            }
            else if (teamFlag == TeamFlag.FRIENDLY && item.UserID != ownerID)
            {
                // 要求目标是友方
                continue;
            }

            list.Add(item);
        }

        return(list.ToArray());
    }
예제 #2
0
    public void RefreshTeamList(TeamFlag team)
    {
        if (TeamFlag.None == team)
        {
            return;
        }

        List <Character> list     = m_teamList[team.ToIndex()];
        List <Character> editList = new List <Character>();

        for (int i = 0; i < list.Count; i++)
        {
            if (null == list[i])
            {
                editList.Add(list[i]);
                continue;
            }

            if (team != list[i].Team)
            {
                editList.Add(list[i]);
                continue;
            }
        }

        for (int i = 0; i < editList.Count; i++)
        {
            list.Remove(editList[i]);
        }
    }
예제 #3
0
    public List <Character> GetEnemiesByRange(TeamFlag team, Vector3 position, float distance)
    {
        List <Character> targets = new List <Character>();

        for (int i = 1; i < m_teamList.Length; i++)
        {
            if (true == team.IsAlly(TeamManager.ToFlag(i)))
            {
                continue;
            }

            List <Character> enemyList = m_teamList[i];
            for (int k = 0; k < enemyList.Count; k++)
            {
                Character enemy = enemyList[k];

                float dist = Vector3.Distance(enemy.transform.position, position);
                if (dist > distance)
                {
                    continue;
                }

                targets.Add(enemy);
            }
        }

        return(targets);
    }
예제 #4
0
    public Character GetEnemyByRange(TeamFlag team, Vector3 position, Vector3 forward, float distance, float angle)
    {
        for (int i = 1; i < m_teamList.Length; i++)
        {
            if (true == team.IsAlly(TeamManager.ToFlag(i)))
            {
                continue;
            }

            List <Character> enemyList = m_teamList[i];
            for (int k = 0; k < enemyList.Count; k++)
            {
                Character enemy = enemyList[k];

                Vector3 dir = enemy.transform.position - position;

                if (Vector3.Angle(dir, forward) > angle * 0.5f)
                {
                    continue;
                }

                if (dir.magnitude > distance)
                {
                    continue;
                }

                return(enemy);
            }
        }

        return(null);
    }
예제 #5
0
    static int IntToEnum(IntPtr L)
    {
        int      arg0 = (int)LuaDLL.lua_tonumber(L, 1);
        TeamFlag o    = (TeamFlag)arg0;

        ToLua.Push(L, o);
        return(1);
    }
예제 #6
0
 private void Add(TeamFlag flag, UnitInfo info, int spawnX, int spawnY)
 {
     Units.Add(new Entry
     {
         Flag   = flag,
         Info   = info,
         SpawnX = spawnX,
         SpawnY = spawnY
     });
 }
예제 #7
0
    public Character[] GetTeamCharacters(TeamFlag team)
    {
        int index = team.ToIndex();

        Character[] characters = new Character[m_teamList[index].Count];
        for (int i = 0; i < m_teamList[index].Count; i++)
        {
            characters[i] = m_teamList[index][i];
        }

        return(characters);
    }
예제 #8
0
        private void SpawnUnit(TeamFlag flag, UnitInfo info, int x, int y)
        {
            if (_grid[x, y] != null)
            {
                throw new ArgumentException($"Supplied coords ({x},{y}) already taken");
            }
            var view = UnitView.Create(flag, _container);
            var unit = new Unit(flag, info, view, this);

            PlaceUnit(unit, x, y);
            _units.Add(unit);
        }
예제 #9
0
        private static string GetPrefabPath(TeamFlag teamFlag)
        {
            switch (teamFlag)
            {
            case TeamFlag.Blue: return("Prefabs/BlueTeam/Blue");

            case TeamFlag.Red:  return("Prefabs/RedTeam/Red");

            default:
                throw new ArgumentOutOfRangeException(nameof(teamFlag), teamFlag, null);
            }
        }
예제 #10
0
        public Unit(TeamFlag team, UnitInfo info, UnitView view, Battle battle)
        {
            Team  = team;
            _info = info;

            Health = MaxHealth;
            Mana   = 0;

            _logic = UnitLogicFactory.Create(info, this, battle);

            View    = view;
            _battle = battle;
            _state  = State.Spawn;
        }
예제 #11
0
    static int set_TeamFlag(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            Buff     obj  = (Buff)o;
            TeamFlag arg0 = (TeamFlag)ToLua.CheckObject(L, 2, typeof(TeamFlag));
            obj.TeamFlag = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index TeamFlag on a nil value" : e.Message));
        }
    }
예제 #12
0
    static int get_TeamFlag(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            Buff     obj = (Buff)o;
            TeamFlag ret = obj.TeamFlag;
            ToLua.Push(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index TeamFlag on a nil value" : e.Message));
        }
    }
예제 #13
0
 static int FindTargets(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 6);
         BattleController    obj  = (BattleController)ToLua.CheckObject(L, 1, typeof(BattleController));
         long                arg0 = (long)LuaDLL.luaL_checknumber(L, 2);
         UnityEngine.Vector3 arg1 = ToLua.ToVector3(L, 3);
         float               arg2 = (float)LuaDLL.luaL_checknumber(L, 4);
         TeamFlag            arg3 = (TeamFlag)ToLua.CheckObject(L, 5, typeof(TeamFlag));
         TargetFlag          arg4 = (TargetFlag)ToLua.CheckObject(L, 6, typeof(TargetFlag));
         Actor[]             o    = obj.FindTargets(arg0, arg1, arg2, arg3, arg4);
         ToLua.Push(L, o);
         return(1);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
예제 #14
0
파일: Actor.cs 프로젝트: fqkw6/AStartTest
 public Actor[] FindTargets(float radius, TeamFlag teamFlag, TargetFlag targetFlag)
 {
     return(BattleController.Instance.FindTargets(UserID, Position, radius, teamFlag, targetFlag));
 }
예제 #15
0
파일: Actor.cs 프로젝트: fqkw6/AStartTest
 // 目标查找
 public Actor FindTarget(float radius, TeamFlag teamFlag, TargetFlag targetFlag)
 {
     return(BattleController.Instance.FindTarget(UserID, Position, radius, teamFlag, targetFlag, FindType.FIND_CLOSEST));
 }
예제 #16
0
 public int GetTeamCount(TeamFlag team)
 {
     return(m_teamList[team.ToIndex()].Count);
 }
예제 #17
0
        public static UnitView Create(TeamFlag teamFlag, Transform parent)
        {
            var go = UnityObject.Instantiate(Originals[teamFlag], parent, true);

            return(new UnitView(go.transform));
        }
예제 #18
0
    // 寻找范围内的单位
    public Actor FindTarget(long ownerID, Vector3 pos, float radius, TeamFlag teamFlag, TargetFlag targetFlag, FindType findType)
    {
        List <Actor> allActors = GetActorList();
        List <Actor> list      = new List <Actor>();

        foreach (var item in allActors)
        {
            // TODO 这里应该有错误
            if (item == this)
            {
                continue;
            }

            if (Vector3.Distance(pos, item.Position) > radius)
            {
                // 超出范围
                continue;
            }

            if (teamFlag == TeamFlag.ENEMY && item.UserID == ownerID)
            {
                // 要求目标是敌人 但是跟目标是同一队伍
                continue;
            }
            else if (teamFlag == TeamFlag.FRIENDLY && item.UserID != ownerID)
            {
                // 要求目标是友方 但是跟目标不是同一队伍
                continue;
            }

            // 炸弹等不能被作为攻击目标
            if (item.CanBeTarget)
            {
                list.Add(item);
            }
        }

        if (list.Count <= 0)
        {
            return(null);
        }

        if (findType == FindType.FIND_CLOSEST)
        {
            // 最近的
            list.Sort((a, b) =>
            {
                var lenA = Vector3.Distance(pos, a.Position);
                var lenB = Vector3.Distance(pos, b.Position);
                return(lenA.CompareTo(lenB));
            });
        }
        else if (findType == FindType.FIND_FARTHEST)
        {
            // 最远的
            list.Sort((a, b) =>
            {
                var lenA = Vector3.Distance(pos, a.Position);
                var lenB = Vector3.Distance(pos, b.Position);
                return(lenB.CompareTo(lenA));
            });
        }
        return(list[0]);
    }