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

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

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

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

Unity

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

Q&A

解決済

1回答

15985閲覧

【Unity】アバターの中心点を軸に回転させたい

sanset

総合スコア186

C#

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

Unity

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

0グッド

0クリップ

投稿2018/01/07 17:57

編集2018/01/10 14:44

Unityちゃんのアバターを使用してプログラミングをしております。

移動で、Unityちゃんを進行方向に向かって横(Z軸)に回転させるという動作を設けたいです。

C#

1if(360 > RotateValue){ 2RotateValue += 30; 3}else{ 4RotateValue = 0; 5} 6 7transform.rotation = Quaternion.Euler(transform.localEulerAngles.x, transform.localEulerAngles.y, dashjumpRotate);transform.rotation = Quaternion.Euler(transform.localEulerAngles.x, transform.localEulerAngles.y, RotateValue);

上記のコードは、Unityちゃんを一回転させるものです。

このようにコードを設定すると回転できるのですが、回転軸がUnityちゃんの足元(?)にあって、Unityちゃんが画面から一瞬フェードアウトします。

説明が下手で申し訳ないですが、こちらのGIFを見ていただくと分かると思います。

GIF動画

リンク元:てんちょーの技術日誌様

Unityちゃんのアバターの中心を軸としたいのですが、GIFのような足を中心とした一回転となってしまいます。

このようなケースの対処法がわからず、こちらで相談した次第です。

お詳しい方、ご教示願えますでしょうか。

【追記】

親要素に空のゲームオブジェクトを設定した時の設定画面です。

スクショ1

スクショ2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

よくあるやり方としては、新しく「GameObject」→「Create Empty」で空のオブジェクトを作り、ユニティちゃんをそのオブジェクトの中に入れ(ヒエラルキー上でユニティちゃんを新しいオブジェクトの子にする)、移動・回転させるときはその新しいオブジェクトの方を操作するという手があるかと思います。

参考: UnityでObjectのPivotを変更する - 脳汁portal

###[追記]
下図のような、「プレイヤー操作用原点」→「Z軸周り回転用原点」→「ユニティちゃん」の三重構造にするのはどうでしょう。プレイヤー操作用原点は本来のユニティちゃんと同じく足下に位置するようにして、Z軸周り回転用原点をおヘソの位置に配置する感じです。

ヒエラルキー

本来のユニティちゃんの原点とプレイヤー操作用原点が一致するようにしておいて、CaracterControllerやプレイヤー制御用スクリプトはプレイヤー操作用原点にアタッチし、Z軸周り回転アクションだけはZ軸周り回転用原点を操作、それ以外はプレイヤー操作用原点を操作するようにすれば、今までの足下原点前提のコードを残したまま回転アクションを加えられるかと思います。

実行時の様子
アクション

ちなみにご参考までに、上図のプレイヤー操作用原点のスクリプトは下記のようになっています。ご質問者さんの設計とは異なる部分が多々あるかと思いますので、あまりお役に立てないかもしれませんが...

C#

1using System.Collections; 2using System.Linq; 3using UnityEngine; 4 5[RequireComponent(typeof(CharacterController))] 6public class PlayerController : MonoBehaviour 7{ 8 public float MaxSpeed = 5.0f; 9 public Animator PlayerAnimator; // ユニティちゃんのAnimator 10 public Transform RotationPivot; // Z軸周り回転用原点 11 private Transform cameraTransform; // 移動制御のためのカメラのTransform(今回の話題とは直接関係ありません) 12 private CharacterController characterController; // プレイヤー操作用原点にアタッチされているCharacterController 13 private Coroutine rollingCoroutine; 14 15 // Z軸周り回転アクション 16 private IEnumerator Roll() 17 { 18 var angle = 0.0f; 19 while (angle < 360.0f) 20 { 21 this.RotationPivot.localEulerAngles = new Vector3(0.0f, 0.0f, angle); // Z軸周り回転はRotationPivotに関して行う 22 angle += 30.0f; 23 yield return null; 24 } 25 26 this.RotationPivot.localEulerAngles = Vector3.zero; 27 this.rollingCoroutine = null; 28 } 29 30 private void Start() 31 { 32 this.characterController = this.GetComponent<CharacterController>(); 33 this.cameraTransform = Camera.main.transform; 34 if (this.PlayerAnimator == null) 35 { 36 this.PlayerAnimator = this.GetComponentInChildren<Animator>(); 37 } 38 if (this.RotationPivot == null) 39 { 40 this.RotationPivot = this.GetComponentsInChildren<Transform>() 41 .Where(t => t.name == "RotationPivot") 42 .First(); 43 } 44 } 45 46 private void Update() 47 { 48 // プレイヤーの移動 49 var input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); 50 var inputMagnitude = Mathf.Clamp01(input.magnitude); 51 var right = this.cameraTransform.right; 52 var forward = this.cameraTransform.forward; 53 forward.y = 0.0f; 54 forward.Normalize(); 55 var motion = ((input.x * right) + (input.y * forward)) * this.MaxSpeed; 56 var speed = motion.magnitude; 57 if (speed > 0.25f) 58 { 59 this.transform.rotation = Quaternion.LookRotation(motion); // 入力に対する向き合わせのための回転はプレイヤー操作用原点のTransformを操作する 60 } 61 this.characterController.SimpleMove(motion); // 移動はプレイヤー操作用原点のCharacterControllerを操作する 62 this.PlayerAnimator.SetFloat("Speed", inputMagnitude); // アニメーションはユニティちゃんのAnimatorを操作する 63 64 // スペースキー押下でZ軸周り回転アクション 65 if ((this.rollingCoroutine == null) && Input.GetKeyDown(KeyCode.Space)) 66 { 67 this.rollingCoroutine = this.StartCoroutine(this.Roll()); 68 } 69 } 70}

投稿2018/01/07 20:50

編集2018/01/11 01:37
Bongo

総合スコア10807

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

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

sanset

2018/01/08 19:09

ありがとうございます! こちらの方法も試して見たのですが、同じような回転になってしまいました。 こ要素のユニティちゃんのpositionをずらすと、回転自体はうまくいっているように見えるのですが、ユニティちゃんが基本地面に埋まってしまいます・・・。 何か根本的に間違っているのでしょうか?
Bongo

2018/01/08 21:47

うーん...具体的に言うと次のような感じでしょうか? - 空のGameObjectを作り、位置をユニティちゃんのおヘソあたりに移動する。 - ユニティちゃんを空オブジェクトの子にする。 - 回転させるスクリプトをユニティちゃん自体から空オブジェクトに付け替える(または、スクリプト中のtransform操作対象をユニティちゃん自身からその親オブジェクトに書き換える)。 - プレイモードにしてみると、本来のユニティちゃんの原点(足下)に新しい親オブジェクトの原点が移動したようになり、結果的にユニティちゃんの下半身が地面に埋まる。 回転自体がうまくいっているなら、あとは位置の制御をどうするかですね。スクリプト中で位置の移動に関わっている部分(transform.positionの書き換えなど)がありましたら、そちらもご提示いただけるとヒントになるかもしれません。 思うに、この位置制御部分が、原点が足下にあることを前提としたコードになっているような気がします(移動時にY座標を強制的に地面の位置にする処理がある、など...原点が足下ならこれで正しくユニティちゃんが地面に立つが、おヘソを原点とすると、その位置が地面の位置に移動して埋まってしまう)。
sanset

2018/01/09 05:58

Bongoさん、親身にご協力くださりありがとうございます...! 仰る通り、位置制御部分は足元になっていると思います。 確認はシーンビューのrotationのZを変更して確認していました。 ただいま出先なので、戻り次第詳しい情報を追記させて頂きます。
sanset

2018/01/10 14:42

遅れて申し訳ありません、詳しい情報を追記させていただきます。 ・空のゲームオブジェクトにunityちゃんを子要素として移動 ・元々unityちゃんでカメラ追従スクリプトや移動スクリプト(CharacterControllerコンポーネントを使用)を使用していたので、それらのスクリプトファイルを親要素に移行 移動スクリプトには重力処理があるので、縦の位置調整(回転の中心)は子要素であるunityちゃんでしかできませんでした。 なので、Bongoさんの仰った「移動時にY座標を強制的に地面の位置にする処理がある」がされております。 ・unityちゃんの位置を-0.5あたりにすると原点から回転しているように見えますが、地面に埋まってしまいます。 移動スクリプトはよくあるキャラクターコントローラーコンポーネントにmove関数を使う処理で、ジャンプなどを行うので重力計算も行なっています。 いろいろモーションの処理が多くここで記述するとややこしくなるのですが、移動自体はこの動画のようなシンプルなものです。 https://www.youtube.com/watch?v=miMCu5796KM 設定の画像などを追記いたしますので、もしよろしければご確認いただけると幸いです。
Bongo

2018/01/10 22:52

Z軸周り回転だけを担当するオブジェクトを介在させた三重構造はどうでしょうか?回答に追記しました。
sanset

2018/01/11 17:57

GIF動画から参考コードまで提供頂き、本当に感謝です...! アドバイスいただいた三重構造で、間に回転用のオブジェクトを挟み、移動スクリプトでそちらのratationを変更することで、理想の動作が実現できました! 自分一人ではここまでたどり着けたかは定かではないので、teratailに相談して、Bongoさんという素晴らしい方に出会えたのは幸運です。 感謝の形がベストアンサーくらいでしか示せないのがとても心苦しいですが、ここまで親身にアドバイスをして頂き本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問