質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1477閲覧

unity ボタンを押すとカメラの現在値を取得し加算するには

lupin2018

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/06/30 13:35

前提・実現したいこと

スクリプト初心者です
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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/30 13:40

カメラの現在値を取得するコードというのが見当たりませんが、どうなってますか
lupin2018

2021/06/30 13:52

ありがとうございます public void OnClick()の下に 座標取得できるtransform.localEulerAngles.y; を入れたりしてみたのですがCS0201エラーが返ってくるだけで行き詰っております
lupin2018

2021/06/30 16:44

using UnityEngine; using DG.Tweening; public class Roll : MonoBehaviour { public void OnClick() { transform.localEulerAngles.y; transform.DORotate(new Vector3(0f, 30f, 0f), 2f).SetEase(Ease.InOutQuart); } }
guest

回答2

0

ベストアンサー

ドキュメントによると...

DORotate(Vector3 to, float duration, RotateMode mode)

Rotates the target to the given value.

Requires a Vector3 end value, not a Quaternion (if you really want to pass a Quaternion, just convert it using myQuaternion.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
Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupin2018

2021/07/01 17:02 編集

ありがとうございます。 教えて頂いた通りRotateMode.WorldAxisAddをいれて見たところ 結果は変わらず現在値を取得しないままY回転0→30の繰り返しでした。 ところが、ボタンを30度に回転している最中の2秒以内にもう一度ボタンを押すと 思いとおりにどんどん加算されていきます 回転しきった2秒後にボタンを押すとリセットされ0からになるのですが 回転しきった2秒後にボタンを押しても現在値から加算されるようにできる様に もう少しがんばってみます
Bongo

2021/07/01 21:32

コメントを受けましてあらためてご質問者さんの現象を読みますと、「回転はリセットされ同じ動きが繰り返される」とおっしゃるのは奇妙ですね...発生する現象の過程を詳しく記述すると - カメラはゲーム開始時点では0°を向いている。 - ボタンを押すと、カメラが2秒かけて30°まで回転し、30°の地点で停止する。 - カメラが30°の地点で停止した後に再度ボタンを押すと、まずカメラの回転が瞬間的に0°に変わり、そこから2秒かけて30°まで回転する。 ということでいいでしょうか?相違点がありましたらコメントください。 私の環境で元のご質問者さんのコード(私が変更を加えたものではなく)を動かしてみると、「初回のみY軸30°へ向かって回転するが、2回目以降は無反応...つまりすでに30°に到達しているので、30°→30°のトゥイーンとなる」というような動きになっていました。 何者かが回転をリセットしているのかもしれませんね...今回ご提示のコード以外に、どこか別のスクリプトにカメラの向きを操作するコードはないでしょうか?
lupin2018

2021/07/02 11:02

ご返信いただきましてありがとうございます - カメラはゲーム開始時点では0°を向いている。 - ボタンを押すと、カメラが2秒かけて30°まで回転し、30°の地点で停止する。 - カメラが30°の地点で停止した後に再度ボタンを押すと、まずカメラの回転が瞬間的に0°に変わり、そこから2秒かけて30°まで回転する。 おっしゃるとおりです。相違点はありません。 >今回ご提示のコード以外に、どこか別のスクリプトにカメラの向きを操作するコードはないでしょうか? 実はマウスの動きに合わせてカメラを回転させるスプリクトをあてておりました。 このスプリクトを外して試してみますと思い通りボタンを押すたび加算される動きになりました ご指摘ありがとうございます 次の課題は360度画像の演出のためこのスプリクトは共存させたく思っていますので もうひとつのスプリクトを書き換えるのか、もしくは中に入れ込むかになりそうです 道のりは長そうですが、がんばります
Bongo

2021/07/02 22:07

なるほど、マウス操作用のスクリプトを切れば正常化したとなると、そこが影響している可能性が高そうですね。 もし行き詰まってしまうようでしたら、U_U_Jenkinsさんのおっしゃるようにスクリプトをご提示いただければ、何かアドバイスできることがあるかもしれません。
lupin2018

2021/07/03 05:24

ありがとうございます。 たびたびお時間さいていただき感謝です マウス用のスプリクトは以下になります。 このマウス操作用のスプリクトは正常に動いています public float mouseSensitivity = 1f; private float minX = -360f; private float maxX = 360f; private float minY = -90f; private float maxY = 90f; private float rotX = 0f; private float rotY = 0f; private Quaternion originalRot; private float scroll = 0f; public float scrollSpeed = 1f; private float minFov = 20f; private float maxFov = 100f; void Start() { originalRot = Camera.main.transform.localRotation; } void Update() { if (Input.GetMouseButton(0)) { rotX -= Input.GetAxis("Mouse X") * mouseSensitivity; rotY -= Input.GetAxis("Mouse Y") * mouseSensitivity; rotX = ClampAngle(rotX, minX, maxX); rotY = ClampAngle(rotY, minY, maxY); Quaternion xQuaternion = Quaternion.AngleAxis(rotX, Vector3.up); Quaternion yQuaternion = Quaternion.AngleAxis(rotY, Vector3.left); Camera.main.transform.localRotation = originalRot * xQuaternion * yQuaternion; } scroll = Input.GetAxis("Mouse ScrollWheel"); Camera.main.fieldOfView -= scroll * scrollSpeed; if (Camera.main.fieldOfView < minFov) { Camera.main.fieldOfView = minFov; } else if (Camera.main.fieldOfView > maxFov) { Camera.main.fieldOfView = maxFov; } } // カメラ操作補正 public static float ClampAngle(float angle, float min, float max) { if (angle < -360f) angle += 360f; if (angle > 360f) angle -= 360f; return Mathf.Clamp(angle, min, max); } }
Bongo

2021/07/03 08:46

コードご提示ありがとうございます。どうやらボタンを押した時にも、マウスボタンの押し下げによってこのスクリプトが作動するのがまずいようですね。また、DOTweenにより回転することでマウス操作用のスクリプトが保持しているrotXと実際のカメラの向きに乖離が起こっているように思います。 干渉を防止する案を検討してみましたが、あんな感じでいかがでしょうか。DOTweenによる回転中はマウス操作による回転を禁止する方針で考えてみましたが、そうではなくてDOTweenによる回転中でもマウス操作を受け付けるようにしたい場合はもっと改修が必要でしょうね。
lupin2018

2021/07/03 12:21

ありがとうございます。 ボタンでの回転中はマウスで動かす必要はないと感じておりますのですごく良いです。 何度もマウス操作やボタン操作を繰り返しても安定しております。 これを基にさらにX軸回転やY軸の反転、FOVのボタン等も作成したいと思います 私は初心者なので見よう見まねでしかできず心が折れそうでしたが、 先輩方のアドバイスはすごくありがたかったです。すべての先輩方に感謝です
guest

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

U_U_Jenkins

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupin2018

2021/07/02 12:20

ありがとうございます。 単体で試してみたところ思いどおりの動きです。 ただマウスの動きに合わせてカメラが動くスクリプトを他に足しているため 回転が初期値に戻る現象が起きています なかなか難しいですね…
U_U_Jenkins

2021/07/02 21:05

どういったスクリプトか記載お願いいたします。
lupin2018

2021/07/03 05:30

ありがとうございます。 以下がマウス用のスプリクトになります。 このマウス操作用のスプリクトは正常に動いています public float mouseSensitivity = 1f; private float minX = -360f; private float maxX = 360f; private float minY = -90f; private float maxY = 90f; private float rotX = 0f; private float rotY = 0f; private Quaternion originalRot; private float scroll = 0f; public float scrollSpeed = 1f; private float minFov = 20f; private float maxFov = 100f; void Start() { originalRot = Camera.main.transform.localRotation; } void Update() { if (Input.GetMouseButton(0)) { rotX -= Input.GetAxis("Mouse X") * mouseSensitivity; rotY -= Input.GetAxis("Mouse Y") * mouseSensitivity; rotX = ClampAngle(rotX, minX, maxX); rotY = ClampAngle(rotY, minY, maxY); Quaternion xQuaternion = Quaternion.AngleAxis(rotX, Vector3.up); Quaternion yQuaternion = Quaternion.AngleAxis(rotY, Vector3.left); Camera.main.transform.localRotation = originalRot * xQuaternion * yQuaternion; } scroll = Input.GetAxis("Mouse ScrollWheel"); Camera.main.fieldOfView -= scroll * scrollSpeed; if (Camera.main.fieldOfView < minFov) { Camera.main.fieldOfView = minFov; } else if (Camera.main.fieldOfView > maxFov) { Camera.main.fieldOfView = maxFov; } } // カメラ操作補正 public static float ClampAngle(float angle, float min, float max) { if (angle < -360f) angle += 360f; if (angle > 360f) angle -= 360f; return Mathf.Clamp(angle, min, max); } }
U_U_Jenkins

2021/07/03 06:57

transform .DORotate(new Vector3(0f, 30f, 0f), 2f) .SetRelative() .SetEase(Ease.InOutQuart) .OnComplete(()=>{ originalRot = Camera.main.transform.localRotation; }); originalRotにコールバックで最終結果をぶち込めばおそらく想定通りかと思います。
lupin2018

2021/07/03 11:55

ありがとうございます。 マウス操作のスプリクトも正常に動き、ボタン押すと加算されていくのですが ボタンを押した後にマウス操作を行い再びボタンを押すとジャンプ?する現象がおきてしまいます ただ教えて頂く中ですごく勉強になっております
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問