Exemplo n.º 1
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="roomId">房间id</param>
    /// <param name="ownerId">所属玩家id</param>
    /// <param name="actorId">自己的id</param>
    /// <param name="posX"></param>
    /// <param name="posZ"></param>
    /// <param name="orientation"></param>
    /// <param name="unitName"></param>
    /// <param name="cellIndex">该单位在地形块HexCell中的Index,因为根据PosX,PosZ可能得不到正确的cell,只能用这个数据确保正确</param>
    /// <param name="actorInfoId">兵种ID,在actor_info表中的id</param>
    /// <param name="name"></param>
    /// <param name="hp"></param>
    /// <param name="attackPower"></param>
    /// <param name="defencePower"></param>
    /// <param name="speed"></param>
    /// <param name="filedOfVision"></param>
    /// <param name="shootingRange"></param>
    /// <param name="attackDuration"></param>
    /// <param name="attackInterval"></param>
    /// <param name="ammoBase"></param>
    /// <param name="ammoBaseMax"></param>
    /// <returns></returns>
    public ActorVisualizer CreateUnit(long roomId, long ownerId, long actorId, int posX, int posZ, float orientation,
                                      string unitName, int cellIndex, int actorInfoId,
                                      string name, int hp, int hpMax, float attackPower, float defencePower, float speed, float filedOfVision, float shootingRange,
                                      float attackDuration, float attackInterval, int ammoBase, int ammoBaseMax)
    {
        HexCell cell = GetCell(cellIndex);

        if (!cell)
        {
            GameRoomManager.Instance.Log($"HexmapHelper CreateUnit :创建Actor失败!格子越界 - <{posX},{posZ}> - {unitName}");
            return(null);
        }

        if (cellIndex == 0)
        {
            Debug.LogError("HexmapHelper CreateUnit Error - CellIndex is lost!!!");
            return(null);
        }

        if (cell.Unit)
        {
            HexCell newCell = null;
            for (HexDirection d = HexDirection.NE; d <= HexDirection.NW; d++)
            {
                HexCell neighbor = cell.GetNeighbor(d);
                if (neighbor && !neighbor.Unit)
                {
                    newCell = neighbor;
                    break;
                }
            }

            if (newCell)
            {
                GameRoomManager.Instance.Log($"HexmapHelper :创建Actor失败!物体位置重合了,重新放置! - 原坐标:<{posX},{posZ}> - 新坐标:<{newCell.coordinates.X},{newCell.coordinates.Z}> - {unitName}");
                cell = newCell;
            }
            else
            {
                GameRoomManager.Instance.Log($"HexmapHelper :创建Actor失败!原来这个格子没有物体,现在有了物体, 附近也没有空地! - <{posX},{posZ}> - {unitName}");
                return(null);
            }
        }

        // 区分颜色
        string newUnitName = unitName;

        if (ownerId != GameRoomManager.Instance.CurrentPlayer.TokenId)
        { // 如果不是自己,蓝色就换成红色(绿色换成黄色)
            if (unitName.IndexOf("BLUE") > 0)
            {
                newUnitName = unitName.Replace("BLUE", "RED");
            }
            else if (unitName.IndexOf("GREEN") > 0)
            {
                newUnitName = unitName.Replace("GREEN", "YELLOW");
            }
        }

        string unitPathName = $"Arts/BeffioPrefabs/Soldiers/{newUnitName}";
        var    go           = Resources.Load <HexUnit>(unitPathName);

        if (go != null)
        {
            HexUnit hu = Instantiate(go);
            if (hu != null)
            {
                hexGrid.AddUnit(hu, cell, orientation);
                var av = hu.GetComponent <ActorVisualizer>();
                if (av != null)
                {
                    av.RoomId      = roomId;
                    av.OwnerId     = ownerId;
                    av.ActorId     = actorId;
                    av.PosX        = posX;
                    av.PosZ        = posZ;
                    av.Orientation = orientation;
                    av.Species     = unitName;
                    av.CellIndex   = cellIndex;
                    av.ActorInfoId = actorInfoId;

                    av.Name          = name;
                    av.Hp            = hp;
                    av.HpMax         = hpMax;
                    av.AttackPower   = attackPower;
                    av.DefencePower  = defencePower;
                    av.Speed         = speed;
                    av.FieldOfVision = filedOfVision;
                    av.ShootingRange = shootingRange;

                    av.AttackDuration = attackDuration;
                    av.AttackInterval = attackInterval;
                    av.AmmoBase       = ammoBase;
                    av.AmmoBaseMax    = ammoBaseMax;
                }

                // 关闭预制件上没用的东西,看以后这东西能否用得上,如果没用,就完全干掉
                if (hu.GetComponentInChildren <ThirdPersonUserControl>())
                {
                    hu.GetComponentInChildren <ThirdPersonUserControl>().enabled = false;
                }
                if (hu.GetComponentInChildren <ThirdPersonCharacter>())
                {
                    hu.GetComponentInChildren <ThirdPersonCharacter>().enabled = false;
                }
                if (hu.GetComponentInChildren <CapsuleCollider>())
                {
                    hu.GetComponentInChildren <CapsuleCollider>().enabled = false;
                }
                EnableFollowCamera(av, false);

                if (!GameRoomManager.Instance.RoomLogic.ActorManager.AllActors.ContainsKey(actorId))
                {
                    ActorBehaviour ab = new ActorBehaviour()
                    {
                        RoomId      = roomId,
                        OwnerId     = ownerId,
                        ActorId     = actorId,
                        PosX        = posX,
                        PosZ        = posZ,
                        Orientation = orientation,
                        Species     = unitName,
                        CellIndex   = cellIndex,
                        ActorInfoId = actorInfoId,

                        Name          = name,
                        Hp            = hp,
                        HpMax         = hpMax,
                        AttackPower   = attackPower,
                        DefencePower  = defencePower,
                        Speed         = speed,
                        FieldOfVision = filedOfVision,
                        ShootingRange = shootingRange,

                        AttackDuration = attackDuration,
                        AttackInterval = attackInterval,
                        AmmoBase       = ammoBase,
                        AmmoBaseMax    = ammoBaseMax,
                    };
                    GameRoomManager.Instance.RoomLogic.ActorManager.AddActor(ab, hu);
                }
                GameRoomManager.Instance.Log($"MSG: CreateATroopReply - 创建了一个Actor - {unitName}");
                return(av);
            }
        }

        return(null);
    }