Пример #1
0
    void Search()
    {
        // ターゲット消失時
        if (target == null)
        {
            if (DrowningPersonList.Count == 0)
            {
                torpedoState = TorpedoState.FAILED;
                return;
            }
            else
            {
                for (int i = 0; i < DrowningPersonList.Count; i++)
                {
                    if (DrowningPersonList[i] == null)
                    {
                        continue;
                    }
                    target = DrowningPersonList[i];
                    return;
                }
                torpedoState = TorpedoState.FAILED;
                return;
            }
        }

        if (SuccessFlg)
        {
            if ((target.transform.position - (transform.position + transform.up)).magnitude < 1f)
            {
                if (target.tag == "DrowingPerson")
                {
                    torpedoState = TorpedoState.RESCUE;
                    target.GetComponent <DrowningPersonBehavior>().Rescued();
                    StageData.IncreaseRescuePersonCnt();
                }
                else
                {
                    torpedoState = TorpedoState.FAILED;
                }
            }
            else if ((target.transform.position - (transform.position + transform.up)).magnitude < 10f && timeElapsed >= timeOut2)
            {
                if (TorpedoSpeed > TorpedoMinSpeed)
                {
                    decel();
                }
                timeElapsed = 0.0f;
            }
            else if ((target.transform.position - (transform.position + transform.up)).magnitude < 30f && timeElapsed >= timeOut)
            {
                if (TorpedoSpeed > TorpedoMaxSpeed / 2f)
                {
                    decel();
                }
                else if (TorpedoSpeed < TorpedoMaxSpeed / 2f)
                {
                    accel();
                }
                timeElapsed = 0.0f;
                // ボート出現
                GetComponent <boatmove>().StartAnimation();
            }
            else if ((target.transform.position - (transform.position + transform.up)).magnitude > 30f)
            {
                accel();
            }
        }
        else
        {
            if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 1f)
            {
                if (target.tag == "DrowingPerson")
                {
                    torpedoState = TorpedoState.RESCUE;
                    target.GetComponent <DrowningPersonBehavior>().Rescued();
                    StageData.IncreaseRescuePersonCnt();
                }
                else
                {
                    torpedoState = TorpedoState.FAILED;
                }
            }
            else if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 10f && timeElapsed >= timeOut2)
            {
                if (TorpedoSpeed > TorpedoMinSpeed)
                {
                    decel();
                }
                timeElapsed = 0.0f;
            }
            else if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 30f && timeElapsed >= timeOut)
            {
                if (TorpedoSpeed > TorpedoMaxSpeed / 2f)
                {
                    decel();
                }
                else if (TorpedoSpeed < TorpedoMaxSpeed / 2f)
                {
                    accel();
                }
                timeElapsed = 0.0f;
            }
            else if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude > 30f)
            {
                accel();
            }
        }

        if (transform.position.y > -4.5f || transform.position.x > 100f || transform.position.x < -100f || transform.position.z > 50f ||
            transform.position.z < -50f)
        {
            torpedoState = TorpedoState.FAILED;
        }
        // --------------- 移動 -----------------
        transform.position += transform.forward * TorpedoSpeed * Time.deltaTime;

        // --------- 障害物感知 ---------
        HitCheck();

        // 障害物なし
        if (!hitplace[(int)CheckPlace.Down] && !hitplace[(int)CheckPlace.Left] && !hitplace[(int)CheckPlace.UP] && !hitplace[(int)CheckPlace.Right])
        {
            Vector3 vec;
            if (SuccessFlg)
            {
                vec = (target.transform.position - (transform.position + transform.up)).normalized;
            }
            else
            {
                vec = (new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).normalized;
            }

            // 救出者が右にいる
            if (Vector3.Dot(vec, transform.right) <= 1f && Vector3.Dot(vec, transform.right) > 0.1f)
            {
                MoveRight();
            }
            // 救出者が左にいる
            else if (Vector3.Dot(vec, transform.right) >= -1f && Vector3.Dot(vec, transform.right) < -0.1f)
            {
                MoveLeft();
            }
            // 救出者が上にいる
            if (Vector3.Dot(vec, transform.up) <= 1f && Vector3.Dot(vec, transform.up) > 0.1f /* && (new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 10f*/)
            {
                MoveUp();
            }
            // 救出者が下にいる
            else if (Vector3.Dot(vec, transform.up) >= -1f && Vector3.Dot(vec, transform.up) < -0.1f)
            {
                MoveDown();
            }
        }
        // 障害物あり
        else
        {
            // --------- 回避 ---------
            Avoidance();
        }

        // --------- 前進速度制限 -----------
        // 最大
        if (TorpedoSpeed > TorpedoMaxSpeed)
        {
            TorpedoSpeed = TorpedoMaxSpeed;
        }
        // 最小
        if (TorpedoSpeed < TorpedoMinSpeed)
        {
            TorpedoSpeed = TorpedoMinSpeed;
        }
    }
Пример #2
0
    // ===================== Update =======================
    void Update()
    {
        if (stageState.GetComponent <StageState>().GetStageState() == StageState.STAGE_STATE.SHOOT)
        {
            return;
        }

        if (stageState.GetComponent <StageState>().GetStageState() == StageState.STAGE_STATE.PRODUCTION)
        {
            if (ProductionDist >= 0f)
            {
                transform.position -= new Vector3(0f, Time.deltaTime * 2f, 0f);
                ProductionDist     -= Time.deltaTime * 2f;
            }
            return;
        }
        // 加速・減速間隔計算用
        timeElapsed += Time.deltaTime;

        switch (torpedoState)
        {
        case TorpedoState.SEARCH:
            Search();
            break;

        case TorpedoState.RESCUE:
            Rescue();
            break;

        case TorpedoState.FAILED:
            Failed();
            break;

        case TorpedoState.EMERGENCY:
            decel();
            if (!SearchDirection[(int)CheckPlace.UP])
            {
                turn(CheckPlace.UP);
            }
            else if (!SearchDirection[(int)CheckPlace.Left])
            {
                turn(CheckPlace.Left);
            }
            else if (!SearchDirection[(int)CheckPlace.Down])
            {
                turn(CheckPlace.Down);
            }
            else if (!SearchDirection[(int)CheckPlace.Right])
            {
                turn(CheckPlace.Right);
            }
            if (TorpedoSpeed < TorpedoMinSpeed && timeElapsed >= timeOut2)
            {
                torpedoState = TorpedoState.SEARCH;
                if (TorpedoRotUD >= TorpedoMaxRot)
                {
                    SearchDirection[(int)CheckPlace.UP] = true;
                }
                else if (TorpedoRotLR <= -TorpedoMaxRot)
                {
                    SearchDirection[(int)CheckPlace.Left] = true;
                }
                else if (TorpedoRotUD <= -TorpedoMaxRot)
                {
                    SearchDirection[(int)CheckPlace.Down] = true;
                }
                else if (TorpedoRotLR >= TorpedoMaxRot)
                {
                    SearchDirection[(int)CheckPlace.Right] = true;
                }
                timeElapsed += Time.deltaTime;
            }
            break;

        case TorpedoState.RETURN:

            break;

        default:
            break;
        }

        if (destflg)
        {
            Destroy(this.gameObject);
        }
    }
Пример #3
0
    // 回避
    void Avoidance()
    {
        bool up, left, down, right;

        up    = hitplace[(int)CheckPlace.UP];
        left  = hitplace[(int)CheckPlace.Left];
        down  = hitplace[(int)CheckPlace.Down];
        right = hitplace[(int)CheckPlace.Right];
        if ((!up && !left && down && right) || (!up && !left && !down && right) || (up && !left && !down && right) ||
            (up && !left && down && !right) || (up && !left && down && right))
        {
            // 左に回避
            MoveLeft();
        }

        else if ((!up && left && down && !right) || (!up && left && !down && !right) || (up && left && !down && !right) ||
                 (up && left && down && !right))
        {
            // 右に回避
            MoveRight();
        }

        else if ((!up && left && down && right) || (!up && !left && down && !right) || (!up && left && !down && right))
        {
            // 上に回避
            MoveUp();
        }

        else if ((up && !left && !down && !right) || (up && left && !down && right))
        {
            // 下に回避
            MoveDown();
        }
        // 全部当たっている
        else if (up && left && down && right)
        {
            // 左チェック
            Vector3 vec = (transform.forward + -transform.right).normalized;
            vec = (transform.forward + vec).normalized;
            vec = (transform.forward + vec).normalized;
            ray = new Ray(transform.position + transform.up * 0.5f + transform.right * range, vec);

            //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
            Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green);

            Vector3 vec1 = (transform.up + transform.right).normalized;
            ray1 = new Ray(transform.position + transform.up * 0.5f + vec1 * range, vec);
            //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
            Debug.DrawLine(ray1.origin, ray1.origin + ray1.direction * distance, Color.green);

            Vector3 vec2 = (-transform.up + transform.right).normalized;
            ray2 = new Ray(transform.position + transform.up * 0.5f + vec2 * range, vec);
            //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
            Debug.DrawLine(ray2.origin, ray2.origin + ray2.direction * distance, Color.green);

            if ((Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) || (Physics.Raycast(ray1, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) ||
                (Physics.Raycast(ray2, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")))
            {
                // 右チェック
                vec = (transform.forward + transform.right).normalized;
                vec = (transform.forward + vec).normalized;
                vec = (transform.forward + vec).normalized;
                ray = new Ray(transform.position + transform.up * 0.5f - transform.right * range, vec);
                //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
                Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green);

                vec1 = (transform.up + -transform.right).normalized;
                ray1 = new Ray(transform.position + transform.up * 0.5f + vec1 * range, vec);
                //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
                Debug.DrawLine(ray1.origin, ray1.origin + ray1.direction * distance, Color.green);

                vec2 = (-transform.up + -transform.right).normalized;
                ray2 = new Ray(transform.position + transform.up * 0.5f + vec2 * range, vec);
                //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
                Debug.DrawLine(ray2.origin, ray2.origin + ray2.direction * distance, Color.green);

                if ((Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) || (Physics.Raycast(ray1, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) ||
                    (Physics.Raycast(ray2, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")))
                {
                    // 上チェック
                    vec = (transform.forward + transform.up).normalized;
                    vec = (transform.forward + vec).normalized;
                    vec = (transform.forward + vec).normalized;
                    ray = new Ray(transform.position + transform.up * 0.5f - transform.up * range, vec);

                    //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
                    Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green);
                    if (Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island"))
                    {
                        // 下チェック
                        vec = (transform.forward - transform.up).normalized;
                        vec = (transform.forward + vec).normalized;
                        vec = (transform.forward + vec).normalized;
                        ray = new Ray(transform.position + transform.up * 0.5f + transform.up * range, vec);

                        //Rayの可視化    ↓Rayの原点    ↓Rayの方向     ↓Rayの色
                        Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green);
                        if (Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island"))
                        {
                            torpedoState = TorpedoState.EMERGENCY;
                        }
                        else
                        {
                            MoveDown();
                        }
                    }
                    else
                    {
                        MoveUp();
                    }
                }
                else
                {
                    MoveRight();
                }
            }
            else
            {
                MoveLeft();
            }
        }
    }