前提・実現したいこと
スクリプト初心者です
UnityでDOTweenを使用し、ボタンを押すたびにカメラの現在値を取得し
そこから2秒で30度カメラが回転するスプリクトを作成したいのですが
下記のスプリクトでは動きはするもののボタンを押しても
回転はリセットされ同じ動きが繰り返されるだけです
ボタン押すたびにカメラの現在値を取得し加算させるにはどうしたらいいのでしょう?
よろしくお願い致します。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
using UnityEngine; using DG.Tweening; public class Roll : MonoBehaviour { public void OnClick() { transform.DORotate(new Vector3(0f, 30f, 0f), 2f).SetEase(Ease.InOutQuart); } }
試したこと
localEulerAnglesを使用したりしてみましたが
初心者にて理解できていません
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/30 13:52
2021/06/30 16:44
回答2件
0
ベストアンサー
ドキュメントによると...
DORotate(Vector3 to, float duration, RotateMode mode)
Rotates the target to the given value.
Requires a
Vector3
end value, not aQuaternion
(if you really want to pass a Quaternion, just convert it usingmyQuaternion.eulerAngles
).
IMPORTANT: when doing small rotations only along the X axis in some limit cases the target will wobble to position. If that happens please use
DORotateQuaternion
instead.
mode
Indicates the rotation mode.
Fast
(default): the rotation will take the shortest route and will not rotate more than 360°.
FastBeyond360
: The rotation will go beyond 360°.
WorldAxisAdd
: Adds the given rotation to the transform using world axis and an advanced precision mode (like when using transform.Rotate(Space.World)). In this mode the end value is always considered relative.
LocalAxisAdd
: Adds the given rotation to the transform's local axis (like when rotating an object with the "local" switch enabled in Unity's editor or using transform.Rotate(Space.Self)). In this mode the end value is is always considered relative.
とのことで、第3引数にモードを与えてやることでデフォルトとは異なる挙動をさせられそうです。
下記のようにしてみてはいかがでしょうか?
lang
1using UnityEngine; 2using DG.Tweening; 3 4public class Roll : MonoBehaviour 5{ 6 public void OnClick() 7 { 8 transform.DORotate(new Vector3(0f, 30f, 0f), 2f, RotateMode.WorldAxisAdd).SetEase(Ease.InOutQuart); 9 } 10}
マウスによるカメラ回転スクリプトの干渉を排除することについて
まず、マウスによるカメラ回転スクリプトのUpdate
周辺を下記のように変更しました。
lang
1 // マウス操作を許可するかどうかを表すプロパティを追加する 2 public bool MouseControlIsEnabled { get; set; } = true; 3 4 // rotXを外部から変更できるようにしておく 5 public float RotX 6 { 7 get => rotX; 8 set => rotX = value; 9 } 10 11 void Update() 12 { 13 // UIオブジェクト上にマウスポインタがある場合、またはマウス操作が許可されていない場合、処理は行わない 14 if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject() || !MouseControlIsEnabled) 15 { 16 return; 17 } 18 19 // 以下、Updateの主要部分は変更なし 20 21 if (Input.GetMouseButton(0)) 22 { 23 rotX -= Input.GetAxis("Mouse X") * mouseSensitivity; 24 rotY -= Input.GetAxis("Mouse Y") * mouseSensitivity; 25 rotX = ClampAngle(rotX, minX, maxX); 26 rotY = ClampAngle(rotY, minY, maxY); 27 28 29 Quaternion xQuaternion = Quaternion.AngleAxis(rotX, Vector3.up); 30 31 Quaternion yQuaternion = Quaternion.AngleAxis(rotY, Vector3.left); 32 33 Camera.main.transform.localRotation = originalRot * xQuaternion * yQuaternion; 34 } 35 36 scroll = Input.GetAxis("Mouse ScrollWheel"); 37 Camera.main.fieldOfView -= scroll * scrollSpeed; 38 if (Camera.main.fieldOfView < minFov) 39 { 40 Camera.main.fieldOfView = minFov; 41 } 42 else if (Camera.main.fieldOfView > maxFov) 43 { 44 Camera.main.fieldOfView = maxFov; 45 } 46 }
そしてRoll
は下記のようにしてみました。なお、マウスによるカメラ回転スクリプトはCameraController
という名前だと仮定しています。これでどうでしょうか?
lang
1using UnityEngine; 2using DG.Tweening; 3 4public class Roll : MonoBehaviour 5{ 6 // CameraControllerを保持するためのフィールドを追加し、インスペクター上でオブジェクトをセットしておく 7 [SerializeField] private CameraController cameraController; 8 9 public void OnClick() 10 { 11 // まずCameraControllerによる回転を禁止する 12 cameraController.MouseControlIsEnabled = false; 13 14 // 回転前の向きを覚えておき... 15 var preRotation = transform.localRotation; 16 17 // 回転後に姿勢の変位を調べてCameraControllerのRotXを更新したのち、マウス操作による回転を許可する 18 transform.DORotate(new Vector3(0f, 30f, 0f), 2f, RotateMode.WorldAxisAdd).SetEase(Ease.InOutQuart).OnComplete( 19 () => 20 { 21 cameraController.RotX += (transform.localRotation * Quaternion.Inverse(preRotation)).eulerAngles.y; 22 cameraController.MouseControlIsEnabled = true; 23 }); 24 } 25}
投稿2021/06/30 19:29
編集2021/07/03 08:59総合スコア10811
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/01 17:02 編集
2021/07/01 21:32
2021/07/02 11:02
2021/07/02 22:07
2021/07/03 05:24
2021/07/03 08:46
2021/07/03 12:21
0
C#
1obj.transform 2.DORotate(new Vector3(0f, 30f, 0f), 2f) 3.SetRelative() 4.SetEase(Ease.InOutQuart);
絶対位置ではなく
相対位置で回転させましょう
尚、SetLoopsつけるとSetRelative()つけているのにも関わらず
絶対位置で回転してしまう模様
この実装のみだと回転処理が入ってから2秒経つ前に同処理が通ると
処理が始まってから30fの回転になってしまうので注意。
正しく動作させたい場合はOnKillなど別途CallBackの実装が必要かと思われます。
投稿2021/07/02 06:26
総合スコア110
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/02 12:20
2021/07/02 21:05
2021/07/03 05:30
2021/07/03 06:57
2021/07/03 11:55
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。