RotateAround は obsolete だそうだけど、代わりに使うように指定されている Transform.Rotate で簡単に RotateAround と同じことができそうにないためそのまま RotateAround でやってみました。
csharp
1using UnityEngine;
2
3public class Rotation : MonoBehaviour
4{
5 [SerializeField] Transform m_pivot;
6 [SerializeField] float m_rotateAngle = 1f;
7 [SerializeField] float m_targetAngle = 90f;
8 float m_currentAngle = 0;
9 int m_spinDirection = 1;
10
11 void Update()
12 {
13 Turn();
14 }
15
16 void Turn()
17 {
18 if (m_spinDirection * m_targetAngle > m_spinDirection * m_currentAngle)
19 {
20 m_currentAngle += m_spinDirection * m_rotateAngle;
21 transform.RotateAround(m_pivot.position, Vector3.back, m_spinDirection * m_rotateAngle);
22 }
23 else
24 {
25 m_spinDirection *= -1;
26 m_targetAngle *= -1;
27 }
28 }
29}
30
(※)以下のコードは最初に示したものですが、回転の中心が自分自身であるため、質問の主旨(中心は別オブジェクト)とは違うものでした。
Unity本来の機能であるアニメーションで簡単に済ませたいけど、説明が大変なのでその次に楽そうなDoTweenを使ったやり方のコードを貼っておきます。
csharp
1using UnityEngine;
2using DG.Tweening;
3
4public class HalfCirclePingPong : MonoBehaviour
5{
6 [SerializeField] float m_sec = 1f;
7 Sequence m_seq;
8
9 void Start()
10 {
11 m_seq = DOTween.Sequence();
12 BuildSequence();
13 //BuildSequence2(); // 本当はこっちでシンプルに済ませたい
14 m_seq.Play();
15 }
16
17 void BuildSequence()
18 {
19 m_seq.Append(transform.DORotate(90 * Vector3.back, m_sec).SetEase(Ease.Linear));
20 m_seq.Append(transform.DORotate(Vector3.zero, m_sec).SetEase(Ease.Linear));
21 m_seq.Append(transform.DORotate(90 * Vector3.forward, m_sec).SetEase(Ease.Linear));
22 m_seq.Append(transform.DORotate(Vector3.zero, m_sec).SetEase(Ease.Linear));
23 m_seq.SetLoops(-1);
24 }
25
26 void BuildSequence2()
27 {
28 transform.Rotate(Vector3.forward, 90f);
29 m_seq.Append(transform.DORotate(90 * Vector3.back, m_sec).SetEase(Ease.Linear));
30 m_seq.SetLoops(-1, LoopType.Yoyo);
31 }
32}