public static void DrawFormation(FormationData formation)
    {
        if (EditorApplication.isPaused)
        {
            return;
        }

        float3 pos1, pos2, pos3, pos4;

        if (formation.Width == 0)
        {
            pos1 = formation.Position + new float3(1, 0, 1);
            pos2 = formation.Position + new float3(-1, 0, 1);
            pos3 = formation.Position + new float3(1, 0, -1);
            pos4 = formation.Position + new float3(-1, 0, -1);
        }
        else
        {
            pos1 = formation.Position + formation.GetOffsetFromCenter(0);
            pos2 = formation.Position + formation.GetOffsetFromCenter(formation.Width - 1);
            pos3 = formation.Position + formation.GetOffsetFromCenter(formation.UnitCount - formation.Width);
            pos4 = formation.Position + formation.GetOffsetFromCenter(formation.UnitCount - 1);
        }

        Color c = formation.IsFriendly ? Color.blue : Color.red;

        // Draw the position of the formation
        Debug.DrawLine(pos1, pos2, c, Time.deltaTime * 2);
        Debug.DrawLine(pos2, pos3, c, Time.deltaTime * 2);
        Debug.DrawLine(pos3, pos4, c, Time.deltaTime * 2);
        Debug.DrawLine(pos4, pos1, c, Time.deltaTime * 2);
        Debug.DrawLine(pos3, pos1, c, Time.deltaTime * 2);
        Debug.DrawLine(pos4, pos2, c, Time.deltaTime * 2);
    }
예제 #2
0
    /// <summary>
    /// 兵种结构, 和阵型数据
    /// idx : 编队ID
    /// </summary>
    /// <param name="idx"></param>
    private void addAllFormation(int idx)
    {
        FormationAgent formation = new FormationAgent();

        // 设置对应的数据
        formation.setData(_battle.getFormation()[idx]);

        int[] soildArray;                        // 保存兵种结构

        if (idx == (int)Defaults.ResultNum.Zero) ///第一个战场
        {
            soildArray = (int[])_battle.getOneStruct().Clone();
        }
        else
        {
            soildArray = (int[])_battle.getTwoStruct().Clone();
        }

        /// 获取阵型
        int[] shapeArray = formation.getShapeArray();

        //  这里需要注意下 兵种结构 的个数 和 阵型的个数 是一致的

        for (int i = 0; i < soildArray.Length; i++)
        {
            // 记录当前的 位置
            float[] pos = { formation.getPosXArray()[i], formation.getPosYArray()[i], formation.getPosZArray()[i] };

            // 兵种ID  兵种阵型ID  位置信息
            FormationData mation = new FormationData(soildArray[i], shapeArray[i], pos, false);

            _formationList.Add(mation);
        }
    }
예제 #3
0
 public static void Initialise()
 {
     DivisionData.Setup();
     FormationData.Setup();
     TeamData.Setup();
     PlayerData.Setup();
 }
예제 #4
0
    public Formation GetFormation(Enums.FormationId formationId)
    {
        FormationData f         = formations.Where(x => x.formationId == formationId).FirstOrDefault();
        Formation     formation = JsonConvert.DeserializeObject <Formation>(f.data.text);

        return(formation);
    }
예제 #5
0
    private void Spawn()
    {
        FormationData chosenFormation = formations[Random.Range(0, formations.Count)];

        if (Random.Range(0, 100f) <= chosenFormation.chance)
        {
            Formation chosen = chosenFormation.formation;
            chosen.Build();
            int   size   = chosen.row0.Count;
            float offset = size / 2f * unitGap;
            float xo     = Random.Range(-boundSize + offset, boundSize - offset);
            for (int i = 0; i < Formation.maxRows; i++)
            {
                List <string> row = chosen.allRows[i];
                for (int j = 0; j < row.Count; j++)
                {
                    string target = row[j];
                    if (target != "0" && target != "")
                    {
                        float   x   = xo + j * unitGap - offset;
                        Vector3 pos = transform.position;
                        pos.x += x;
                        pos.y += i * rowGap;
                        objectPooler.SpawnFromPool(target, pos, transform.rotation);
                    }
                }
            }
            nextSpawnTime = Time.time + 1f / spawnRate;
        }
    }
예제 #6
0
    public void PopulatePlayers(List <PlayerData> _players, FormationData _formation, SquadScreen _controller)
    {
        for (int i = 0; i < _players.Count; i++)
        {
            players[i].Populate(_players[i], _controller, i);
        }

        UpdateFormation(_formation);
    }
예제 #7
0
    public override void OnInspectorGUI()
    {
        EditorGUILayout.BeginVertical(GUI.skin.box);
        EditorGUI.indentLevel++;
        EditorGUILayout.LabelField("阵型编辑器:");
        EditorGUILayout.LabelField("在任意场景使用这个东西编辑一个阵型,");
        EditorGUILayout.LabelField("然后将阵型保存为数据文件");
        EditorGUI.indentLevel--;
        EditorGUILayout.EndVertical();

        EditorGUILayout.Space();

        if (GUILayout.Button("Add Node"))
        {
            self.AddNode();
        }

        EditorGUILayout.Space();

        base.OnInspectorGUI();

        EditorGUILayout.Space();

        if (GUILayout.Button("Reset"))
        {
            self.ClearNodes();
        }

        EditorGUILayout.Space();

        EditorGUILayout.Space();

        EditorGUILayout.BeginVertical(GUI.skin.box);
        EditorGUI.indentLevel++;
        EditorGUILayout.LabelField("- 点击\"Save Current Formation\"将把当前阵型保存为位置数据");
        EditorGUILayout.LabelField("- 保存的数据文件在: Assets-Set it when you use this system");
        EditorGUI.indentLevel--;
        EditorGUILayout.EndVertical();

        if (GUILayout.Button("Save Current Formation"))
        {
            FormationData formation = ScriptableObject.CreateInstance("FormationData") as FormationData;

            Vector3[] data = new Vector3[self.nodes.Count];
            for (int i = 0; i < self.nodes.Count; i++)
            {
                data[i] = self.nodes[i].position;                       //save world position
            }

            formation.Setup(self.formationName, data);

            AssetDatabase.CreateAsset(formation, "Assets/Prefabs/FormationData/" + self.formationName.ToString() + ".asset");
            AssetDatabase.SaveAssets();

            self.SetDefaultName();
        }
    }
예제 #8
0
파일: SetupTeams.cs 프로젝트: srog/FMS
        private static void GenerateNewTeam(int index, Models.JsonConverters.Team teamData)
        {
            var divisionId   = ((index - 1) / GameData.TeamsPerDivision) + 1;
            var cashQuotient = 120 - (teamData.InitialRanking * 2);
            var cash         = rnd.Next(1, cashQuotient) * 1000000;
            var formation    = FormationData.GetRandomFormation();

            TeamData.AddNewTeam(teamData.TeamName, teamData.InitialRanking,
                                divisionId, cash, formation);
        }
예제 #9
0
    public void UpdateFormation(FormationData _data)
    {
        formation = _data;
        for (int i = 0; i < _data.Zones.Length; i++)
        {
            Zone zone = _data.Zones[i];
            players[i].MoveTo(GetZone(zone).transform.position, zone);
        }

        UpdateConnections();
    }
예제 #10
0
 public int GetFormationId(FormationData _data)
 {
     for (int i = 0; i < List.Length; i++)
     {
         if (_data == List[i])
         {
             return((int)_data.Type);
         }
     }
     return(0);
 }
예제 #11
0
 public void Read(GamePacketReader reader)
 {
     SplineId = reader.ReadUInt();
     Speed    = reader.ReadUInt();
     Position = reader.ReadUInt();
     FormationData.Read(reader);
     Mode                = reader.ReadEnum <SplineMode>(4u);
     Offset              = reader.ReadUInt();
     Blend               = reader.ReadBit();
     IsContinuing        = reader.ReadBit();
     AdjustSpeedToLength = reader.ReadBit();
 }
예제 #12
0
 public void Write(GamePacketWriter writer)
 {
     writer.Write(SplineId);
     writer.Write(Speed);
     writer.Write(Position);
     FormationData.Write(writer);
     writer.Write(Mode, 4u);
     writer.Write(Offset);
     writer.Write(Blend);
     writer.Write(IsContinuing);
     writer.Write(AdjustSpeedToLength);
 }
예제 #13
0
        public void Execute()
        {
            //deltaTime += Time.deltaTime;
            for (int i = 0; i < formationList.Length; ++i)
            {
                FormationData formation = formationList[i];
                float         distance  = math.length(CameraPosition - formation.formationPosition);
                for (int j = 0; j < formation.count(); j++)
                {
                    float3 center = formation.formationPosition;
                    float3 v3     = new float3(center.x + j % formation.width * 3f, 1, center.z + j / formation.width * 3);
                    float4 v4     = new float4(v3.x, v3.y, v3.z, 1);
                    int    index  = 1;//Randomizer.Range(0, 6, ref motionDeltaTime);
                    AnimationClipDataBaked clip = animationClips[(int)0 * 25 + index];
                    normalizedTime = /*normalizedTimeStart*/ 0 + deltaTime / clip.AnimationLength;
                    //Unity.Mathematics.Random r = new Unity.Mathematics.Random((uint)Time.realtimeSinceStartup);
                    float rad = Randomizer.Float(0.1f, 0.3f, ref motionDeltaTime);
                    normalizedTime = (normalizedTime + rad) % 1.0f;
                    float texturePosition = normalizedTime * clip.TextureRange + clip.TextureOffset;
                    int   lowerPixelInt   = (int)math.floor(texturePosition * clip.TextureWidth);

                    float  lowerPixelCenter    = (lowerPixelInt * 1.0f) / clip.TextureWidth;
                    float  upperPixelCenter    = lowerPixelCenter + clip.OnePixelOffset;
                    float  lerpFactor          = (texturePosition - lowerPixelCenter) / clip.OnePixelOffset;
                    float3 texturePositionData = new float3(lowerPixelCenter, upperPixelCenter, lerpFactor);
                    if (distance < DistanceMaxLod0)
                    {
                        listPositionData0.Add(v4);
                        listRotation0.Add(Quaternion.LookRotation(new Vector3(-90, 9, 0), new Vector3(0.0f, 1, 0.0f)));
                        listTexturePosition0.Add(texturePositionData);
                    }
                    else if (distance < DistanceMaxLod1)
                    {
                        listPositionData1.Add(v4);
                        listRotation1.Add(Quaternion.LookRotation(new Vector3(-90, 8, 0), new Vector3(0.0f, 1, 0.0f)));
                        listTexturePosition1.Add(texturePositionData);
                    }
                    else if (distance < DistanceMaxLod2)
                    {
                        listPositionData2.Add(v4);
                        listRotation2.Add(Quaternion.LookRotation(new Vector3(-90, 7, 0), new Vector3(0.0f, 1, 0.0f)));
                        listTexturePosition2.Add(texturePositionData);
                    }
                    else
                    {
                        listPositionData3.Add(v4);
                        listRotation3.Add(Quaternion.LookRotation(new Vector3(-90, 30, 0), new Vector3(0.0f, 1, 0.0f)));
                        listTexturePosition3.Add(texturePositionData);
                    }
                }
            }
        }
예제 #14
0
 public void InitializeData(FormationData formationData)
 {
     /*
      * initData = formationData;
      * if (initData != null)
      * {
      *  formationName = initData.name;
      *  prefab = initData.prefab;
      *  hierarchyLevel = initData.hierarchyLevel;
      * }
      */
     CreatePrefab();
 }
예제 #15
0
    public void OnDropDownSelect()
    {
        List <FormationData> fileList = new List <FormationData>(Tools.GetAtFolder <FormationData>("Data/Formations"));

        foreach (FormationData data in fileList)
        {
            if (data.Name == formationNameList[dropdown.value])
            {
                Formation = data;
                Populate();
            }
        }
    }
예제 #16
0
    public Entity Spawn(SpawnPointComponent point)
    {
        var settings = SimulationSettings.Instance;

        int unitCount     = SimulationSettings.Instance.UnitsPerFormation;
        var formationData = new FormationData(unitCount, settings.FormationWidth, point.IsFriendly, point.Type, point.Position);
        //formationData.EnableMovement = false;

        var formationEntity = spawnerObject.Spawn(formationData, point.offset, formationWaypoints, true);

        ++totalRequested;
        return(formationEntity);
    }
예제 #17
0
    public void CreateNew()
    {
        FormationData data = ScriptableObject.CreateInstance <FormationData>();

        data.Name        = "0-0-0";
        data.Zones       = new Zone[] { Zone.OwnGoal };
        data.Connections = new List <FormationData.Connection>();
        #if UNITY_EDITOR
        AssetDatabase.CreateAsset(data, folder + data.Name + ".asset");
        AssetDatabase.SaveAssets();
        #endif
        Formation = data;
        Populate();
    }
예제 #18
0
    public static float3 GetOffsetFromCenter(int unitId, ref FormationData formation, float radius = 1.0f)
    {
        float3 sideVector = formation.Forward.zyx;

        sideVector.x = -sideVector.x;

        // required to hit the corners correctly
        var sideOffset = sideVector * radius * formation.Width * formation.formationSide * 0.5f;

        var height = math.ceil((float)formation.UnitCount / formation.Width);

        return(sideVector * ((unitId % formation.Width) - (formation.Width * 0.5f)) * radius + sideOffset +
               formation.Forward * (unitId / formation.Width - (height * 0.5f)) * radius);
    }
예제 #19
0
    // 兵种结构, 阵型  pos信息,是否是自己  -- 最终实现
    private void setAllData(int[] soldierArray, int[] shapeIdArray, float[] posXArray, float[] posYArray, float[] posZArray)
    {
        formationList.Clear();

        for (int i = 0; i < soldierArray.Length; ++i)
        {
            // 组织pos信息
            float[] pos = { posXArray[i], posYArray[i], posZArray[i] };

            FormationData mation = new FormationData(soldierArray[i], shapeIdArray[i], pos, true);

            formationList.Add(mation);
        }
    }
예제 #20
0
    private void initilize()
    {
        if (init)
        {
            return;
        }
        init = true;
        PreSetting          setting      = Resources.Load <PreSetting>("PreSetting");
        var                 bakingObject = GameObject.Instantiate(setting.go) as GameObject;
        SkinnedMeshRenderer renderer     = bakingObject.GetComponentInChildren <SkinnedMeshRenderer>();
        LodData             lodData      = new LodData();

        lodData.Lod1Mesh     = setting.mesh0;
        lodData.Lod2Mesh     = setting.mesh1;
        lodData.Lod3Mesh     = setting.mesh2;
        lodData.Lod1Distance = 10;
        lodData.Lod2Distance = 20;
        lodData.Lod3Distance = 30;
        Material material = setting.material;

        //SkinnedMeshRenderer r = Combine.CombineIt(bakingObject.transform);
        bakedData = KeyframeTextureBaker.BakeClips(renderer, GetAllAnimationClips(renderer.GetComponentInParent <Animation>()), lodData);
        //bakedData = KeyframeTextureBaker.BakeClips(r, GetAllAnimationClips(r.GetComponentInParent<Animation>()), lodData);

        TransferAnimationData();

        //UnityEngine.Object fGo = Resources.Load("Formation");
        for (int i = 0; i < formationCount; i++)
        {
            Vector3 formationPosition = new Vector3(i % 5 * (width + 30), 1, i / 5 * (height + 20));

            //GameObject instance = Object.Instantiate(fGo) as GameObject;
            //instance.name = "Formation_" + i;
            //Formation form = instance.GetComponent<Formation>();
            //form.Init(width, height);
            //instance.transform.position = formationPosition;
            FormationData data = new FormationData();
            data.width             = width;
            data.height            = height;
            data.formationPosition = formationPosition;
            formationList.Add(data);
        }

        lodDrawer0 = new LodedDrawerECS(bakedData.NewMesh, material, bakedData);
        lodDrawer1 = new LodedDrawerECS(bakedData.lods.Lod1Mesh, material, bakedData);
        lodDrawer2 = new LodedDrawerECS(bakedData.lods.Lod2Mesh, material, bakedData);
        lodDrawer3 = new LodedDrawerECS(bakedData.lods.Lod3Mesh, material, bakedData);
    }
    private void SpawnFormation(float3 position, Vector3 forward)
    {
        if (spawner == null)
        {
            return;
        }

        var settings = SimulationSettings.Instance;

        int unitCount     = SimulationSettings.Instance.UnitsPerFormation;
        var formationData = new FormationData(unitCount, settings.FormationWidth, IsFriendly, UnitType, position);

        if (Static)
        {
            formationData.EnableMovement = false;
        }
        spawner.Spawn(formationData, new float3(0, 0, 0), formationWaypoints, false, forward);
    }
        public void Write(GamePacketWriter writer)
        {
            writer.Write(SplineIds.Count, 10u);
            foreach (var splineId in SplineIds)
            {
                writer.Write(splineId);
            }

            writer.Write(Speed);
            writer.Write(Position);
            writer.Write(TakeoffLocationHeight);
            writer.Write(LandingLocationHeight);
            FormationData.Write(writer);
            writer.Write(Mode, 4);
            writer.Write(Offset);
            writer.Write(MultiSplineFlags);
            writer.Write(Blend);
            writer.Write(IsContinuing);
        }
예제 #23
0
    private void UpdateFormationDropdown()
    {
        formationNameList = new List <string>();

        int selected = 0;

        for (int i = 0; i < Formations.List.Length; i++)
        {
            FormationData data = Formations.List[i];
            formationNameList.Add(data.Name);
            if (data.Name == Team.Formation.Name)
            {
                selected = i;
            }
        }

        formationDropdown.ClearOptions();
        formationDropdown.AddOptions(formationNameList);
        formationDropdown.value = selected;
    }
예제 #24
0
    private void SpawnPlayers(TeamData _team, List <MatchPlayer> _list, Vector2 _spawnPoint, MatchZonesContainer _zones)
    {
        PlayerData[]  players   = _team.Squad;
        FormationData formation = _team.Formation;

        for (int i = 0; i < players.Length; i++)
        {
            MatchPlayer player = Instantiate(playerTemplate, playersContainer);
            player.transform.localPosition = _spawnPoint;
            player.Populate(players[i], (i + 1).ToString());
            player.gameObject.SetActive(true);
            _list.Add(player);
        }

        for (int j = 0; j < formation.Zones.Length; j++)
        {
            Zone zone = formation.Zones[j];
            _list[j].MoveTo(GetZone(zone, _zones).transform.position, 1f, 0.1f * j);
        }
    }
예제 #25
0
    private void SpawnFormation()
    {
        var settings = SimulationSettings.Instance;

        var isFriendly = totalRequested % 2 == 0;

        float3 position = new float3((totalRequested / 2) % width / 2f * sidewaysStep * (totalRequested / 2 % 2 == 0 ? -1 : 1)
                                     - ((totalRequested % 4 >= 2) ? sidewaysStep * 0.5f : 0),
                                     0f, ((totalRequested) / (width * 2) * forwardStep + initialPosition) * (isFriendly ? 1 : -1));

        int typeBase = (totalRequested / (width * 2)) % 2;
        var unitType = (UnitType)(typeBase * 2 + totalRequested % 2);

        int unitCount     = SimulationSettings.Instance.UnitsPerFormation;
        var formationData = new FormationData(unitCount, settings.FormationWidth, isFriendly, unitType, position);

        spawnerObject.Spawn(formationData, new float3(0, 0, 0), formationWaypoints);

        ++totalRequested;
    }
예제 #26
0
        public RowsFormation(int rows, int columns, double depth = 1, double sidemargin = 1) : this()
        {
            Data = new FormationData(FormationTypeIdentifier)
            {
                Name      = FormationTypeIdentifier,
                Positions = new Position[rows * columns]
            };
            Rows       = rows;
            Columns    = columns;
            Depth      = depth;
            SideMargin = sidemargin;

            for (int row = 0; row < rows; row++)
            {
                for (int col = 0; col < columns; col++)
                {
                    //Data.Positions[row * columns + col] = new Position((rows - row) * Depth, col * SideMargin, 0);
                    Data.Positions[row * columns + col] = new Position(col * SideMargin, -(rows - row) * Depth, -90);
                }
            }
        }
예제 #27
0
    public void UpdateCellFmtData(FormationData fmtData, FormationData.SingleLocation cellData)
    {
        if (cellData.isArrayEye)
        {
            fmtEyeIcon.transform.localScale = Vector3.one;
            fmtEyeIcon.PlayAnim(cellData.buffData.Icon);

            eyePropText.transform.localScale = Vector3.one;
            SetEyeBuffData(cellData);
        }
        else
        {
            fmtEyeIcon.transform.localScale  = Vector3.zero;
            eyePropText.transform.localScale = Vector3.zero;
        }

        actorAvatarSlot.Hide(true, false);
        npcAvatarSlot.Hide(true, false);
        progressBG.transform.localScale    = Vector3.one;
        lifeProgress.transform.localScale  = Vector3.one;
        powerProgress.transform.localScale = Vector3.one;
    }
예제 #28
0
    private void UpdateDropdown()
    {
        List <FormationData> fileList = new List <FormationData>(Tools.GetAtFolder <FormationData>("Data/Formations"));

        formationNameList = new List <string>();

        int selected = 0;

        for (int i = 0; i < fileList.Count; i++)
        {
            FormationData data = fileList[i];
            formationNameList.Add(data.Name);
            if (data.Name == Formation.Name)
            {
                selected = i;
            }
        }
        print(selected);
        dropdown.ClearOptions();
        dropdown.AddOptions(formationNameList);
        dropdown.value = selected;
    }
 public void Setup()
 {
     formationData = FormationDatabase.Instance.PickRandomFormation(waveEnemyTotal);
 }
예제 #30
0
    /// <summary>
    /// 兵种结构, 和阵型数据
    /// idx : 编队ID
    /// </summary>
    /// <param name="idx"></param>
    private void addAllFormation( int idx )
    {
        FormationAgent formation = new FormationAgent();

        // 设置对应的数据
        formation.setData(_battle.getFormation()[idx]);

        int[] soildArray; // 保存兵种结构

        if (idx == (int)Defaults.ResultNum.Zero) ///第一个战场
        {
            soildArray = (int[])_battle.getOneStruct().Clone();
        }
        else
        {
            soildArray = (int[])_battle.getTwoStruct().Clone();
        }

        /// 获取阵型
        int[] shapeArray = formation.getShapeArray();

        //  这里需要注意下 兵种结构 的个数 和 阵型的个数 是一致的

        for (int i = 0; i < soildArray.Length; i++)
        {
            // 记录当前的 位置
            float[] pos = { formation.getPosXArray()[i], formation.getPosYArray()[i], formation.getPosZArray()[i] };

            // 兵种ID  兵种阵型ID  位置信息
            FormationData mation = new FormationData(soildArray[i], shapeArray[i], pos, false);

            _formationList.Add(mation);
        }
    }
예제 #31
0
 public override Formation FromData(FormationData data)
 {
     return(new RowsFormation(data));
 }
예제 #32
0
    // 兵种结构, 阵型  pos信息,是否是自己  -- 最终实现
    private void setAllData(int[] soldierArray, int[] shapeIdArray, float[] posXArray, float[] posYArray, float[] posZArray)
    {
        formationList.Clear();

        for (int i = 0; i < soldierArray.Length; ++i)
        {
            // 组织pos信息
            float[] pos = { posXArray[i], posYArray[i], posZArray[i] };

            FormationData mation = new FormationData(soldierArray[i], shapeIdArray[i], pos, true);

            formationList.Add(mation);
        }
    }