Unity/3d/敵の動き
提供: 初心者エンジニアの簡易メモ
プレイヤーの周りを敵が回転しながら一定間隔で止まる動き
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); } } }