예제 #1
0
 ArrowUnit GetArrow()
 {
     if (listArrowDisable.Count == 0)
     {
         return((Instantiate(arrowPrefab) as GameObject).GetComponent <ArrowUnit>());
     }
     else
     {
         ArrowUnit arrow = listArrowDisable[0];
         listArrowDisable.RemoveAt(0);
         return(arrow);
     }
 }
예제 #2
0
    public RoadUnit ExtendPath(RoadUnit road, int depth)
    {
        if (depth < 0)
        {
            return(road);
        }

        if (!road)
        {
            road = CreateRoad(Vector3.zero, GameDefine.Direction.Forward, 14, true);
        }

        if (depth == 0)
        {
            return(road);
        }

        if (road.arrow == null)
        {
            Vector3   crossingPoint = road.startPoint + road.length * RoadDirections[(int)road.direction];
            ArrowUnit arrow         = MainObjControl.Instant.arrowCtrl.CreateArrow(crossingPoint, road.direction);
            float[]   nextLengths   = { GameDefine.roadRandSize, GameDefine.roadRandSize };
            bool[]    colors        = { Random.value > 0.5 ? true : false, true };
            colors[1] = !colors[0];

            arrow.road = road;
            road.next  = new RoadUnit[2];

            for (int i = 0; i < 2; i++)
            {
                GameDefine.Direction turn = arrow.directions[i];
                bool  color      = colors[i];
                float nextLength = nextLengths[i];

                road.next[i]        = CreateRoad(crossingPoint, turn, nextLength, color);
                road.next[i].father = road;
                // MainObjControl.Instant.blockCtrl.GetBlock(crossingPoint, turn, color, true);
            }
            road.arrow = arrow;
        }

        if (depth >= 1)
        {
            foreach (RoadUnit nextRoad in road.next)
            {
                ExtendPath(nextRoad, depth - 1);
            }
        }

        return(road);
    }
예제 #3
0
        /// <summary>
        /// return arrow to pool
        /// </summary>
        /// <param name="arrow">arrow to return</param>
        private static void returnToPool(Arrow arrow)
        {
#if DEBUG_INFO
            if (m_arrowPool == null)
            {
                Debug.LogError("object cannot be null");
                return;
            }
#endif
            ArrowUnit aunit = m_arrowPool.Find(x => x.arrow == arrow);

            if (aunit == null)
            {
                return;
            }
            aunit.inUse = false;
            aunit.arrow.gobject.SetActive(false);
            aunit.arrow.gobject.transform.SetParent(null);
            aunit.arrow.advanceLifetime = false;
            aunit.arrow.lifetime        = 0f;
            aunit.arrow.state           = Arrow.STATES.READY;

#if DEBUG_ARROW_PATH
            arrow_debug_paths[arrow].Clear();
#endif

            // reset trail object if present
            if (aunit.arrow.trailObj != null)
            {
                aunit.arrow.trailObj.gameObject.SetActive(false);
            }

            // disable collider
            if (aunit.arrow.Collider)
            {
                aunit.arrow.Collider.enabled   = false;
                aunit.arrow.Collider.isTrigger = true;
            }

            // disable rigid body
            if (aunit.arrow.RigidBody)
            {
                aunit.arrow.RigidBody.isKinematic      = true;
                aunit.arrow.RigidBody.detectCollisions = false;
                aunit.arrow.RigidBody.useGravity       = false;
            }
        }
예제 #4
0
    IEnumerator Move(ArrowUnit unit, Vector3 to, float duration, bool isSet)
    {
        float   elapsed = 0;
        Vector3 from    = unit.transform.position;

        while (elapsed <= duration)
        {
            unit.transform.position = Vector3.Lerp(from, to, elapsed / duration);
            elapsed += Time.deltaTime;
            yield return(null);
        }

        if (isSet)
        {
            listArrowDisable.Add(unit);
        }

        unit.transform.position = to;
    }
예제 #5
0
    public void Set(Vector3 startPoint, GameDefine.Direction direction, float length)
    {
        this.startPoint = startPoint;
        this.length     = length;
        this.direction  = direction;
        arrow           = null;
        block           = null;
        next            = null;

        Vector3 scale;
        Vector3 pos;

        float scaleLength = length - GameDefine.roadDistance;

        if (direction == GameDefine.Direction.Forward)
        {
            scale.x = GameDefine.roadWidth;
            scale.z = scaleLength;
            pos     = startPoint + Vector3.forward * (0.5f * GameDefine.roadWidth + 0.5f * scale.z + GameDefine.roadDistance);
        }
        else
        {
            scale.z = GameDefine.roadWidth;

            if (direction == GameDefine.Direction.Right)
            {
                scale.x = scaleLength;
                pos     = startPoint + Vector3.right * (0.5f * GameDefine.roadWidth + 0.5f * scale.x + GameDefine.roadDistance);
            }
            else
            {
                scale.x = scaleLength;
                pos     = startPoint + Vector3.left * (0.5f * GameDefine.roadWidth + 0.5f * scale.x + GameDefine.roadDistance);
            }
        }

        scale.y = GameDefine.roadTall;

        transform.localScale = scale;
        transform.position   = pos;
    }
    public ArrowUnit CreateArrow(Vector3 forkPos, GameDefine.Direction pathDir)
    {
        GameDefine.Direction[] turns = new GameDefine.Direction[2];

        if (pathDir == GameDefine.Direction.Forward)
        {
            turns[0] = GameDefine.Direction.Forward;
            turns[1] = Random.value > 0.5 ? GameDefine.Direction.Right : GameDefine.Direction.Left;
        }
        else
        {
            turns[0] = pathDir;
            turns[1] = GameDefine.Direction.Forward;
        }

        // TODO: Create Fork
        ArrowUnit arrow = GetArrow();

        arrow.SetPosition(forkPos, pathDir, turns);
        arrow.directions = turns;

        return(arrow);
    }
예제 #7
0
        /// <summary>
        /// creates arrow and sets it up in hand
        /// </summary>
        /// <param name="arrowPrefab">arrow prefab to instantiate</param>
        /// <param name="arrowAttachBone">transform on which to attach arrow</param>
        /// <returns></returns>
        public static Arrow CreateArrow(
            GameObject arrowPrefab,
            Transform arrowAttachBone,
            float maxLifetime,
            float arrowLength,
            LayerMask layers,
            IGameCharacter _owner)
        {
#if DEBUG_INFO
            if (m_arrowPool == null)
            {
                Debug.LogError("object cannot be null"); return(null);
            }
            if (m_active_arrows == null)
            {
                Debug.LogError("object cannot be null"); return(null);
            }
            if (!arrowPrefab)
            {
                Debug.LogError("_currentArrowPrefab is null. Cannot create arrow"); return(null);
            }
            if (!arrowAttachBone)
            {
                Debug.LogError("object cannot be null"); return(null);
            }
#endif

            ArrowUnit newArrowUnit = null;

            // try to find available arrow
            for (int i = 0; i < m_arrowPool.Count; i++)
            {
                if (!m_arrowPool[i].inUse)
                {
                    newArrowUnit       = m_arrowPool[i];
                    newArrowUnit.inUse = true;

                    break;
                }
            }

            // if not create new
            if (newArrowUnit == null)
            {
                GameObject arrowObject =
                    (GameObject)MonoBehaviour.Instantiate(arrowPrefab);
                Arrow newArrow = new Arrow(arrowObject, _owner);
                newArrowUnit = new ArrowUnit(newArrow);
                m_arrowPool.Add(newArrowUnit);

                newArrow.gobject.name = arrowPrefab.name + m_arrowPool.Count;

#if DEBUG_ARROW_PATH
                arrow_debug_paths[newArrow] = new List <Vector3>();
#endif
            }


#if DEBUG_INFO
            if (newArrowUnit == null)
            {
                Debug.LogError("creating arrow failed."); return(null);
            }
#endif
            newArrowUnit.arrow.gobject.transform.position = Vector3.zero;
            newArrowUnit.arrow.gobject.transform.rotation = Quaternion.identity;
            newArrowUnit.arrow.gobject.transform.SetParent(arrowAttachBone, false);
            newArrowUnit.arrow.gobject.SetActive(true);
            newArrowUnit.arrow.position                   = Vector3.zero;
            newArrowUnit.arrow.prevPosition               = Vector3.zero;
            newArrowUnit.arrow.direction                  = Vector3.zero;
            newArrowUnit.arrow.fly_time                   = 0.0f;
            newArrowUnit.arrow.state                      = Arrow.STATES.READY;
            newArrowUnit.arrow.speed                      = 0.0f;
            newArrowUnit.arrow.advanceLifetime            = false;
            newArrowUnit.arrow.RigidBody.detectCollisions = false;
            newArrowUnit.arrow.RigidBody.isKinematic      = true;
            newArrowUnit.arrow.Collider.enabled           = false;
            newArrowUnit.arrow.layers                     = layers;
            newArrowUnit.arrow.length                     = arrowLength;
            newArrowUnit.arrow.maxLifetime                = maxLifetime;


            m_active_arrows.Add(newArrowUnit.arrow);

            return(newArrowUnit.arrow);
        }
예제 #8
0
 public void SetArrow(ArrowUnit arrow)
 {
     listArrowDisable.Add(arrow);
 }
예제 #9
0
    public void SetNewArrow(Vector3 p1, Vector3 p2, Vector3 p3)
    {
        CheckArrow();
        currentArrow = GetArrow();
        Vector3 pos;

        if (p1.z == p3.z)
        {
            pos = Vector3.back * f;
            if (p1.x > p3.x)
            {
                listDirect[0] = foward;
                listDirect[1] = left;
            }
            else
            {
                listDirect[0] = foward;
                listDirect[1] = right;
            }
        }
        else if (p1.x == p3.x)
        {
            pos           = Vector3.right * f;
            listDirect[0] = foward;
            listDirect[1] = left;
        }
        else
        {
            if (p1.x == p2.x)
            {
                if (p2.x < p3.x)
                {
                    pos           = Vector3.left * f;
                    listDirect[0] = foward;
                    listDirect[1] = right;
                }
                else
                {
                    pos           = Vector3.right * f;
                    listDirect[0] = foward;
                    listDirect[1] = left;
                }
            }
            else
            {
                pos = Vector3.back * f;
                if (p1.x < p2.x)
                {
                    listDirect[0] = foward;
                    listDirect[1] = right;
                }
                else
                {
                    listDirect[0] = foward;
                    listDirect[1] = left;
                }
            }
        }

        if (isFirst)
        {
            currentArrow.transform.position = p2;
            isFirst = false;
        }
        else
        {
            currentArrow.transform.position = new Vector3(p2.x, -5.5f, p2.z);
        }


        currentArrow.arrow.localPosition = new Vector3(pos.x, 2.81f, pos.z);

        int rand = Random.Range(0, 2);

        currentArrow.arrow.transform.eulerAngles = listDirect[rand];
        currentArrow.roadR.transform.eulerAngles = listDirect[rand];
        if (rand == 0)
        {
            isDirect0 = true;
        }
        else
        {
            isDirect0 = false;
        }
    }