コード例 #1
0
    bool DoAttack()
    {
        eye.aimList.RemoveAll((g) => g == null || TerrainUnit.IsStaticType(g.type));
        if (eye.aimList.Count > 0)
        {
            eye.aimList.OrderBy((g) => (g.transform.position - transform.position).magnitude);
            int i = 0; bool validTarget = true;
            while (!TerrainUnit.IsManualType(eye.aimList[i].GetComponent <TerrainUnit>().type))
            {
                i++;
                if (i >= eye.aimList.Count)
                {
                    validTarget = false;
                    break;
                }
            }
            if (validTarget)
            {
                GameObject instance = Instantiate(bulletPrefab, this.transform.position, Quaternion.identity);
                instance.GetComponent <BulletMotivation>().target = eye.aimList[i].gameObject;
                return(true);
            }
        }
        return(false);

        // return false;
    }
コード例 #2
0
 IEnumerable <TerrainUnit> GetNeibours(int x, int y)
 {
     x %= size.x;
     for (int i = 0; i < 4; i++)
     {
         if (((_4direction[i, 0] + x) < 0) ||
             ((_4direction[i, 0] + x) >= size.x) ||
             (_4direction[i, 1] + y < 0) ||
             (_4direction[i, 1] + y >= size.y)
             )
         {
             continue;
         }
         TerrainUnit t = null;
         try
         {
             t = map[_4direction[i, 0] + x, _4direction[i, 1] + y];
         }
         catch (System.Exception)
         {
             Debug.Log((_4direction[i, 0] + x) + " " + (_4direction[i, 1] + y));
         }
         if (t != null)
         {
             yield return(t);
         }
     }
 }
コード例 #3
0
    /// <summary>
    /// 查找四周有无符合条件的邻居
    ///
    /// t: 留空则搜索 IsManualType
    /// </summary>
    public bool HasNeibour(int x, int y, Func <UnitType, bool> t = null
                           )
    {
        // x += poolCur;
        x %= size.x;
        for (int i = 0; i < 4; i++)
        {
            if (_4direction[i, 0] + x < 0 || _4direction[i, 0] + x >= size.x ||
                _4direction[i, 1] + y < 0 || _4direction[i, 1] + y >= size.y)
            {
                continue;
            }
            if (t == null)
            {
                if (!TerrainUnit.IsManualType(map[_4direction[i, 0] + x, _4direction[i, 1] + y].type))// type
                {
                    continue;
                }
            }
            else
            {
                if (!t(map[_4direction[i, 0] + x, _4direction[i, 1] + y].type))// type
                {
                    continue;
                }
            }

            if (1 >= Mathf.Abs(map[_4direction[i, 0] + x, _4direction[i, 1] + y].position.y - map[x, y].position.y))// 0<= dy <= 1
            {
                return(true);
            }
        }
        return(false);
    }
コード例 #4
0
ファイル: PlayManager.cs プロジェクト: timrockefeller/Captris
    /// <summary>
    /// 生成单片walkable方块
    /// </summary>
    /// <returns></returns>
    IEnumerator SpawnPiece()
    {
        pieceCount++;
        this.nextPieces.Dequeue();
        //update resource
        for (int i = 0; i < unitConfig.GetConfig(this.selectedType).resourceNeeded.Length; i++)
        {
            this.playerResources[(ResourceType)i] -= unitConfig.GetConfig(this.selectedType).resourceNeeded[i];
        }
        hudManager.UpdateResource(playerResources, playerMaxResources);

        hudManager.Placed(this.selectedType);
        foreach (Vector3Int occ in this.selectedData.GetOccupy())
        {
            TerrainUnit targetTerrain = worldManager.GetUnit(selectingPosition.x + occ.x, selectingPosition.z + occ.z);
            if (targetTerrain != null)
            {
                targetTerrain.SetType(this.selectedType);
            }
            else
            {
                continue;
            }
            yield return(new WaitForSeconds(0.1f));
        }
        // end piece
        this.selectedData.ResetRotate();
    }
コード例 #5
0
    void Start()
    {
        map = new TerrainUnit[MAP_X, MAP_Y, MAP_Z];
        for (int x = 0; x < MAP_X; x++)
        {
            for (int y = 0; y < MAP_Y; y++)
            {
                for (int z = 0; z < MAP_Z; z++)
                {
                    TerrainUnit t = new TerrainUnit();
                    t.ID = x.ToString() + y.ToString() + z.ToString();
                    if (z <= SEA_LEVEL)
                    {
                        string[] tempC = { "Si", "Fe", "C-", "Au" };
                        t.Composition = tempC;
                        float[] tempCP = { 91.00f, 3.00f, 3.00f, 3.00f };
                        t.CompositionPercentages = tempCP;
                    }
                    map [x, y, z] = t;

                    Instantiate(tr, new Vector3(x, y, z), Quaternion.identity);
                }
            }
        }


        Debug.Log("Generated: " + Time.realtimeSinceStartup);
    }
コード例 #6
0
    /// <summary>
    /// cd count if has target in field
    /// </summary>
    /// <returns></returns>
    bool HaveTarget()
    {
        previteHaveTargetCount++;
        if (previteHaveTargetCount > 5)
        {
            foreach (var item in eye.aimList)
            {
                if (TerrainUnit.IsManualType(item.GetComponent <TerrainUnit>().type))
                {
                    previteHaveTarget      = true;
                    previteHaveTargetCount = 0;
                    return(true);
                }
            }

            previteHaveTargetCount = 0;
            previteHaveTarget      = false;
            return(false);
        }
        return(previteHaveTarget);
    }
コード例 #7
0
 public void Deposit(TerrainUnit deposit)
 {
     strata.Push(deposit);
 }
コード例 #8
0
 public void RefreshBuff()
 {
     while (buffInstances.Count > 0)
     {
         Destroy(buffInstances.Dequeue());
     }
     if (worldManager)
     {
         bool[,] visited = new bool[worldManager.size.x, worldManager.size.y];
         for (int _x = 0; _x < worldManager.size.x; _x++)
         {
             for (int _z = 0; _z < worldManager.size.y; _z++)
             {
                 if (!visited[_x, _z] && worldManager.GetUnit(_x, _z).localBuff != UnitBuffType.NONE)
                 {
                     visited[_x, _z] = true;
                     var buffRange = worldManager.SpreadBFS(new Vector3Int(_x, 0, _z),
                                                            (me, him) => me.localBuff == him.localBuff,
                                                            p =>
                     {
                         visited[p.x, p.z] = true;
                         return(true);
                     });
                     GameObject buffInstance = Instantiate(buffPrefab, null);
                     buffInstance.GetComponent <BuffEffect>().LoadMeshByBlocks(buffRange, TerrainUnit.GetColorByBuffType(worldManager.GetUnit(_x, _z).localBuff));
                     buffInstances.Enqueue(buffInstance);
                 }
             }
         }
     }
 }
コード例 #9
0
    public bool SetType(UnitType t)
    {
        if (this.type != UnitType.Empty && pieceInstance != null || t == UnitType.Empty)
        {
            ClearOut();
            Destroy(pieceInstance);
            if (subInstance != null)
            {
                Destroy(subInstance);
            }
        }

        if (!InitStaticType(t))
        {
            this.type = t;
            if (t == UnitType.Empty)
            {
                // reset
                _canProducing = false;
                isProducer    = false;
                return(false);
            }

            this.pieceInstance = Instantiate(piecePrefab, transform.position + new Vector3(0, 0.5f, 0), Quaternion.identity);
            this.pieceInstance.transform.SetParent(this.transform);
            this.pieceInstance.GetComponent <MeshRenderer>().material.SetColor("_Color", TerrainUnit.GetColorByType(this.type));


            this.progressFiller     = this.pieceInstance.transform.Find("Canvas").Find("Filler").GetComponent <Image>();
            this.progressBackground = this.pieceInstance.transform.Find("Canvas").Find("Back").GetComponent <Image>();
            // produce handle
            this.isProducer = unitConfig.IsProducer(this.type);
            if (this.isProducer)
            {
                this.localPeriod  = unitConfig.GetProducePeriod(this.type);
                this.subPrefab    = unitConfig.GetProducePrefab(this.type);
                this.canProducing = true;
            }
            else
            {
                this.canProducing = false;
                this.subPrefab    = unitConfig.GetProducePrefab(this.type);// for static prefabs
                if (subPrefab != null)
                {
                    this.subInstance = Instantiate(subPrefab, transform.position + new Vector3(0, 0.5f, 0), Quaternion.identity);
                }
            }
            // default Prefab
            switch (t)
            {
            case UnitType.Mine:
                subPrefab = MinePrefab;
                // static Instance
                subInstance = Instantiate(MinePrefab, transform.position + new Vector3(-0.5f, 0.5f, -0.5f), Quaternion.identity);
                //  Random Generate Factor Range
                var buffRange = worldManager.SpreadBFS(this.position,
                                                       (me, him) => (me.position - him.position).magnitude < 2.3f && Math.Abs(me.position.y - him.position.y) <= 1);
                foreach (var item in buffRange)
                {
                    worldManager.GetUnit(item).localBuff = UnitBuffType.INCREASE_FACTORY;
                }
                // flush buff mesh
                break;

            case UnitType.Storage:
                playManager.IncreaseMaxResource();    //  every storage take 1
                break;

            default:
                break;
            }
        }
        return(true);
    }
コード例 #10
0
ファイル: PlayManager.cs プロジェクト: timrockefeller/Captris
    /// <summary>
    /// 通过鼠标事件更新预览方块的位置,并计算可否放置(this.slectingCanPlace)
    /// </summary>
    /// <param name="unit"></param>
    public void UpdateSlectingPosition(TerrainUnit unit)
    {
        if (playState == PlayState.ELECTED)
        {
            selectingPosition = unit.position;

            if (previewInstance)
            {                                                                                                                                                // update transform
                previewInstance.transform.position = new Vector3(selectingPosition.x + 0.5f, selectingPosition.y / 2.0f + 0.2f, selectingPosition.z + 0.5f); //  +offsets
                previewInstance.transform.rotation = Quaternion.Euler(0, -90 * selectedData.rotate, 0) * Quaternion.identity;
            }

            slectingCanPlace = true;

            // whether on save alttitude
            foreach (Vector3Int occ in this.selectedData.GetOccupy())
            {
                TerrainUnit targetTerrain = worldManager.GetUnit(selectingPosition.x + occ.x, selectingPosition.z + occ.z);
                if (targetTerrain == null || targetTerrain.type != UnitType.Empty || targetTerrain.position.y != worldManager.GetUnit(selectingPosition.x, selectingPosition.z).position.y)
                {
                    slectingCanPlace = false;
                    break;
                }
            }

            if (slectingCanPlace)
            {
                // is first one
                // 检查周边有无已放置
                // targetTerrain
                bool hasNeibour = false;
                foreach (Vector3Int occ in this.selectedData.GetOccupy())
                {
                    TerrainUnit targetTerrain = worldManager.GetUnit(selectingPosition.x + occ.x, selectingPosition.z + occ.z);
                    if (targetTerrain != null && worldManager.HasNeibour(selectingPosition.x + occ.x, selectingPosition.z + occ.z,
                                                                         t => t == UnitType.Road || t == UnitType.Spawn
                                                                         ))
                    {
                        hasNeibour = true;
                        break;
                    }
                }
                if (!hasNeibour)
                {
                    slectingCanPlace = false;
                }
            }
            // 染色
            for (int i = 0; i < previewInstance.transform.childCount; i++)
            {
                Material mt = previewInstance.transform.GetChild(i).GetComponent <MeshRenderer>().material;
                mt.SetColor(
                    "_Color",
                    TerrainUnit.GetColorByType(
                        (this.slectingCanPlace) ? this.selectedType : UnitType.Empty
                        )
                    );
                mt.SetFloat(
                    "_GOpacity",
                    0.5f
                    );
                mt.SetFloat(
                    "_RimRang",
                    0
                    );
            }
        }
    }