【Unity2D】敵オブジェクトを画面内でランダムに移動させる

ランダム移動

敵の頭部が、向かって上側にある画像の場合に、移動方向が変わるたびに頭部も移動方向へ回転する

using UnityEngine;

public class RotateHeadTowardsDirection : MonoBehaviour
{
    public float moveSpeed = 3f; // 移動速度
    public float changeDirectionIntervalMin = 1f; // 方向を変更する最小の時間間隔
    public float changeDirectionIntervalMax = 3f; // 方向を変更する最大の時間間隔

    private Vector2 currentDirection;

    void Start()
    {
        // 最初の進行方向を設定する
        ChangeDirection();
        // ランダムな時間間隔で進行方向を変更する
        InvokeRepeating("ChangeDirection", Random.Range(changeDirectionIntervalMin, changeDirectionIntervalMax), Random.Range(changeDirectionIntervalMin, changeDirectionIntervalMax));
    }

    void Update()
    {
        // 現在の速度を取得する
        Vector2 velocity = GetComponent<Rigidbody2D>().velocity;

        // 速度が0でない場合、敵の頭を速度の方向に向ける
        if (velocity != Vector2.zero)
        {
            // 速度の角度を計算する
            float angle = Mathf.Atan2(velocity.y, velocity.x) * Mathf.Rad2Deg;
            // 敵の頭を速度の方向に向ける
            transform.rotation = Quaternion.AngleAxis(angle - 90f, Vector3.forward);
        }
    }

    // ランダムな方向にオブジェクトを移動する
    void ChangeDirection()
    {
        currentDirection = Random.insideUnitCircle.normalized;
        MoveObject(currentDirection);
    }

    // オブジェクトを指定された方向に移動する
    void MoveObject(Vector2 direction)
    {
        // 移動する
        GetComponent<Rigidbody2D>().velocity = direction * moveSpeed;
    }
}

移動を画面内に限定

敵オブジェクトが画面外へ行かないように、画面端でぶつかるようにする

using UnityEngine;

public class KeepInBounds : MonoBehaviour
{
    private Camera mainCamera;
    private Vector2 screenBounds;
    private float objectWidth;
    private float objectHeight;

    void Start()
    {
        mainCamera = Camera.main;
        screenBounds = mainCamera.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, mainCamera.transform.position.z));
        objectWidth = transform.GetComponent<SpriteRenderer>().bounds.extents.x; // オブジェクトの幅の半分
        objectHeight = transform.GetComponent<SpriteRenderer>().bounds.extents.y; // オブジェクトの高さの半分
    }

    void LateUpdate()
    {
        // オブジェクトの位置を制限する
        Vector3 viewPos = transform.position;
        viewPos.x = Mathf.Clamp(viewPos.x, screenBounds.x * -1 + objectWidth, screenBounds.x - objectWidth);
        viewPos.y = Mathf.Clamp(viewPos.y, screenBounds.y * -1 + objectHeight, screenBounds.y - objectHeight);
        transform.position = viewPos;
    }
}

タイトルとURLをコピーしました