LotosLabo

プログラミング技術とか気になった情報を載せていきます

【Unity】オブジェクトの回転実践例

実際にゲームを作った際に使用したオブジェクトの回転をまとめてみました。

▼時計回り回転


m_RotateValue += Time.deltaTime * m_RotateSpeed;
m_RotateRoot.localRotation = Quaternion.Euler(0, 0, m_RotateValue);



▼反時計回り回転


m_RotateValue += Time.deltaTime * -m_RotateSpeed;
m_RotateRoot.localRotation = Quaternion.Euler(0, 0, m_RotateValue);



▼指定した角度内での反復回転

指定した角度になったら速度を反転してあげる。

m_RotateValue += Time.deltaTime * m_RotateSpeed;
if (m_RotateValue / m_ForwardRotateLimitAngle > 1.0f || m_RotateValue / m_ReverseRotateLimitAngle < -1.0f){
  m_RotateSpeed *= -1f;
}
m_RotateRoot.localRotation = Quaternion.Euler(0, 0, m_RotateValue);



▼指定したターゲット方向に回転


// ターゲットまでの距離.
var targetLocation = (m_Target.position - m_RotateRoot.position).normalized;
// ターゲットまでのQuaternionを取得.
var targetDirection = Quaternion.FromToRotation(m_Target.up, targetLocation);
var localAngle = targetDirection.eulerAngles.z;
m_RotateRoot.localRotation = Quaternion.Euler(0, 0, localAngle);



指定したターゲット方向にスムーズに回転

こっちのほうが見た目的に良い。

// ターゲットまでの距離.
var targetLocation = (m_Target.position - m_RotateRoot.position).normalized;
// ターゲットまでのQuaternionを取得.
var targetDirection = Quaternion.FromToRotation(m_Target.up, targetLocation);
m_RotateRoot.localRotation = Quaternion.Slerp(m_RotateRoot.localRotation, targetDirection, m_RotateSpeed / 1000f);



▼指定したターゲット方向に、指定した角度内でスムーズに回転

// ターゲットまでの距離.
var targetLocation = (m_Target.position - m_RotateRoot.position).normalized;
// ターゲットまでのQuaternionを取得.
var targetDirection = Quaternion.FromToRotation(m_Target.up, targetLocation);
var localAngle = targetDirection.eulerAngles;

// 0~360度になっているので、-180~180度に変換する.
localAngle.z = (localAngle.z > 180) ? localAngle.z - 360 : localAngle.z;

// 角度を制限.
localAngle.z = Mathf.Clamp(localAngle.z, -m_ReverseRotateLimitAngle, m_ForwardRotateLimitAngle);

// 0~360度に戻す.
localAngle.z = (localAngle.z < 0) ? localAngle.z + 360 : localAngle.z;

// Quaternionに変換.
targetDirection = Quaternion.Euler(localAngle);

m_RotateRoot.localRotation = Quaternion.Slerp(m_RotateRoot.localRotation, targetDirection, m_RotateSpeed / 1000f);


処理をまとめたものを上げておきます。
Inspectorで指定してあげれば動くと思います。