Ejemplo n.º 1
0
    public void DoUpdate(float deltaTime)
    {
        timer += deltaTime;
        if (timer < updateInterval)
        {
            return;
        }

        if (owner == null)
        {
            return;
        }
        timer = 0;
        Vector2Int dir           = Vector2Int.zero;
        var        isReachTheEnd = CollisionHelper.HasColliderWithBorder(owner.dir, owner.GetHeadPos());

        if (isReachTheEnd)
        {
            List <int> allWalkableDir = new List <int>();
            for (int i = 0; i < (int)(EDir.EnumCount); i++)
            {
                var vec = (Vector2)CollisionHelper.GetDirVec((EDir)i) * Walker.TANK_HALF_LEN;
                var pos = owner.pos + vec;
                if (!CollisionHelper.HasCollider(pos))
                {
                    allWalkableDir.Add(i);
                }
            }

            var count = allWalkableDir.Count;
            if (count > 0)
            {
                owner.dir = (EDir)(allWalkableDir[Random.Range(0, count)]);
            }

            return;
        }

        var iPos = owner.pos.Floor();

        if ((owner.pos - (iPos + Global.UnitSizeVec)).sqrMagnitude < sqrtTargetDist)
        {
            if (Random.value > turnRate)
            {
                return;
            }
            //random change dir if it can
            var borderDir = CollisionHelper.GetDirVec((EDir)((int)(owner.dir + 1) % (int)EDir.EnumCount));
            var iBorder1  = iPos + borderDir;
            var iBorder2  = iPos - borderDir;
            if (!CollisionHelper.HasCollider(iBorder1))
            {
                owner.dir = CollisionHelper.GetEDirFromVec(borderDir);
            }
            else if (!CollisionHelper.HasCollider(iBorder2))
            {
                owner.dir = CollisionHelper.GetEDirFromVec(Vector2Int.zero - borderDir);
            }
        }
    }