facebook twitter hatena line email

Unity/3d/敵の動き

提供: 初心者エンジニアの簡易メモ
2023年5月26日 (金) 01:26時点におけるAdmin (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

プレイヤーの周りを敵が回転しながら一定間隔で止まる動き

GameObject targetAvater; // プレイヤーキャラ
public float rotationSpeed = 135.0f; // 回転速度
public float rotationRadius = 2.0f; // 回転半径
public float maxDistance = 10.0f; // 最大追跡距離
private bool isMoving = true; // 移動中かどうかのフラグ
public float moveDuration = 2.0f; // 移動時間
public float stopDuration = 1.0f; // 停止時間
private float moveTimer = 0.0f; // 移動タイマー
private float stopTimer = 0.0f; // 停止タイマー
private float playerDirect; // 敵とプレイヤーの距離
// Playerの周りをぐるぐる回る
void UpdateEnemyRotationPlayer()
{
    // プレイヤーとの距離を計算
    playerDirect = Vector3.Distance(transform.position, targetAvater.transform.position);
    // プレイヤーが最大追跡距離以内にいる場合
    if (playerDirect <= maxDistance)
    {
        // 移動中の場合
        if (isMoving)
        {
            // 回転角度を計算
            float rotationAngle = rotationSpeed * Time.deltaTime;
            // 回転中心周りに回転
            transform.RotateAround(targetAvater.transform.position, Vector3.up, rotationAngle);
            // 向きを回転に合わせて変更
            transform.LookAt(targetAvater.transform.position);
            // 移動タイマーが移動時間を超えたら停止する
            moveTimer += Time.deltaTime;
            if (moveTimer > moveDuration)
            {
                isMoving = false;
                stopTimer = 0.0f;
                moveTimer = 0.0f;
            }
        }
        else
        {
            // 停止中の場合
            // 停止タイマーが停止時間を超えたら移動する
            stopTimer += Time.deltaTime;
            if (stopTimer > stopDuration)
            {
                isMoving = true;
                stopTimer = 0.0f;
                moveTimer = 0.0f;
            }
        }
    }
    else
    {
        UpdateEnemyTrace();
    }
}

重力に対して浮遊する

// 浮遊する
float floatingForce = 9.8f;
private void UpdateFloating()
{
    if (transform.localPosition.y < 0)
    {
        Vector3 floatingDirection = Vector3.up; // 上方向に浮遊するためのベクトル
        Rigidbody rb = gameObject.GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.AddForce(floatingDirection * this.floatingForce, ForceMode.Force);
        }
    }
}