ランダム移動
敵の頭部が、向かって上側にある画像の場合に、移動方向が変わるたびに頭部も移動方向へ回転する
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;
}
}