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

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

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

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

Unity

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

Q&A

解決済

1回答

846閲覧

ドラッグした方向に合わせてオブジェクトを傾けたい

Beginner3309

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2019/07/22 12:08

前提・実現したいこと

実現したいものに最も近いプログラムを誠に勝手ながら使用させて頂いております。
現状の動きとして、上下にドラッグするとオブジェクトが動きに合わせて傾くのですが、左右にドラッグするとカメラが動きます。これを、左右にドラッグしたら上下ドラッグと同じような挙動でオブジェクトを傾けさせたいのですが、如何せん、初心者なものでどのように改良すればよいかわからない状態にあります。

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DownController : MonoBehaviour
{
Rigidbody rigid;

// Start is called before the first frame update void Start() { rigid = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { if (Input.GetMouseButton(0)) { OnRotate(new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"))); } } float RotationSpeed=1.0f; //deltaはドラッグの方向を取得しています。 void OnRotate(Vector2 delta) { // 回転量はドラッグ方向ベクトルの長さに比例する float deltaAngle = delta.magnitude * RotationSpeed; // 回転量がほぼ0なら、回転軸を求められないので何もしない if (Mathf.Approximately(deltaAngle, 0.0f)) { return; } // ドラッグ方向をワールド座標系に直す // 横ドラッグならカメラのright方向、縦ドラッグならup方向ということなので // deltaのx、yをright、upに掛けて、2つを合成すればいいはず... Transform cameraTransform = Camera.main.transform; Vector3 deltaWorld = cameraTransform.right * delta.x + cameraTransform.up * delta.y; // 回転軸はドラッグ方向とカメラforwardの外積の向き Vector3 axisWorld = Vector3.Cross(deltaWorld, cameraTransform.forward).normalized; // Rotateで回転する // 回転軸はワールド座標系に基づくので、回転もワールド座標系を使う transform.Rotate(axisWorld, deltaAngle, Space.World); }
C#

試したこと

一番下にあるtransform.Rotate(axisWorld,deltaAngle,Space.World) を transform.Rotate(deltaAngle,deltaAngle,Space.World) のように変更してみたのですが、そうすると右斜めに回転するようになりました

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Bongo

2019/07/22 20:33

このコードからだけでは原因特定は難しいですね...ヒエラルキーの様子はどうなっていますでしょうか?また、何かカメラの動きをコントロールするためのスクリプトを使っているでしょうか。
Beginner3309

2019/07/23 01:45

返信ありがとうございます。 このコード以外にプログラムは使用していなく、カメラも上から見下ろす位置で固定しているだけです。 ビー玉迷路のようにワールドを傾けてプレイヤー(球体)を操るゲームを作ろうと思っておりまして、ほかにいじっている所は球体とワールドの Bounciness を 0.9 にして反発をつけているだけです。
Bongo

2019/07/24 21:52

すみません、まだ再現させることができず行き詰まっております... 「左右にドラッグするとカメラが動く」とおっしゃるのは、本当にカメラが動いているのでしょうか?シーンビューとゲームビューを同時に表示できるようなレイアウトにして、もしゲームビューの「Maximize On Play」がオンならオフにしてプレイし、シーンビュー上でカメラの動きを観察するとどうなっているでしょうか。ゲームビュー上でマウス操作を行うとカメラが移動したり回転したりしていますでしょうか。 「ビー玉迷路のように」とのコメントでちょっと思い当たったのですが、現状だとたとえば画面上で大きく円を描くようにマウスを動かし続けると、オブジェクトがカメラの視線軸(仮に真上からオブジェクトを見ているとするとワールドY軸)周りに少しずつ回転してしまうかと思います。コードの仕様上正常な動きではあるのですが、ビー玉迷路ゲームでそんな動作をすると、プレイを続けているうちに迷路が画面に対して傾いていってしまい見栄えがよくなさそうに思いました。この現象のことを指しているのでしょうか?
Beginner3309

2019/07/24 22:36

お忙しい中ありがとうございます。再度、現状の動きを改めて確認しますと、おっしゃる通り、オブジェクトが周りに回転するのが確認できました。こちらの確認不足で、貴重な時間を使わっせてしまって申し訳ありません。また、プレイしているときに画面に対して傾いていき見栄えが悪くなるというのも、おっしゃる通りであり、傾きに上限をつける必要性があると思いました。カメラは、TPSゲームのようにビー玉の後ろ上を見下ろす形で追従させようと考えていたのですが、その点に関しても、何か問題になりうることがあるでしょうか。
guest

回答1

0

ベストアンサー

なるほど、オブジェクトの傾きのせいでカメラが動いていたように見えたということでしょうか。確かに背景とか陰影を作り込まないと、オブジェクトの動きとカメラの動きを見かけ上区別できなくなるということはありそうですね。

迷路が画面に対してどんどん傾いてしまう件についてですが、とりあえず回転方式を変えて、もっと素朴に水平方向と垂直方向の2軸ヒンジをイメージした形にしてみるのはどうでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class DownController : MonoBehaviour 6{ 7 public float rotationSpeedX = 1.0f; 8 public float rotationSpeedY = 1.0f; 9 public float rotationAngleXMax = 30.0f; 10 public float rotationAngleXMin = -30.0f; 11 public float rotationAngleYMax = 30.0f; 12 public float rotationAngleYMin = -30.0f; 13 14 float rotationAngleX; 15 float rotationAngleY; 16 17 Rigidbody rigid; 18 19 // Start is called before the first frame update 20 void Start() 21 { 22 rigid = GetComponent<Rigidbody>(); 23 } 24 25 // Update is called once per frame 26 void Update() 27 { 28 if (Input.GetMouseButton(0)) 29 { 30 OnRotate(new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"))); 31 } 32 } 33 34 //deltaはドラッグの方向を取得しています。 35 void OnRotate(Vector2 delta) 36 { 37 // 回転量を積算し、ついでに制限範囲内にクランプする 38 rotationAngleX = Mathf.Clamp( 39 rotationAngleX + delta.x * rotationSpeedX, 40 rotationAngleXMin, 41 rotationAngleXMax); 42 rotationAngleY = Mathf.Clamp( 43 rotationAngleY + delta.y * rotationSpeedY, 44 rotationAngleYMin, 45 rotationAngleYMax); 46 47 // MoveRotationを使い、積算角度の分だけX軸・Z軸周りに回転した姿勢にする 48 rigid.MoveRotation(Quaternion.Euler(rotationAngleY, 0.0f, -rotationAngleX)); 49 } 50}

transform.rotationの操作ではなくrigid.MoveRotationを使ってみました。これは、ビー玉迷路のようなゲームを想定しているとのことですので、フィールド全体が動的コライダーになっているだろうと想像してのことです。キネマティックに設定したRigidbodyに対してMoveRotationを使うと、単なる姿勢の瞬間変更ではなく角速度を適切に計算してくれるという特徴がありますので、フィールド上に乗っかっているボールの挙動がより自然になるんじゃないでしょうか?

カメラの追従については、上記のような方法だとカメラの動きとフィールドの動きは独立していますので、さほど問題を起こすような要素はなさそうに思います。
追従させるにも色々な方法があるかと思いますが、【Unity 入門】【チュートリアル】玉転がしゲームを作る 3. カメラの移動 - コガネブログで紹介されているような「ボールの位置からオフセット量の分だけずらした位置にカメラを移動する」というのがシンプルでいいかもしれませんね。
これをベースに、たとえば「カメラが目標移動先まで加減速しながら移動する」みたいに改造して、カメラマンがカメラを手動操作しているかのような動きにしたり...と、いろいろ工夫を加えても面白いと思います。
カメラをボールの子階層に入れるという手も考えられますが、注目対象が人型キャラクターのような転がらない物体ならともかく、ボールだと相性が悪いかもしれません。ボールの転がりによってボールのローカル座標系も回転するでしょうから、カメラがぐるぐる回ってえらいことになりそうです。

他に検討するべき事項としては、フィールドを傾ける操作によってボールが受ける力積をどうするかでしょうかね...?
今の状態だとフィールドは原点で支えられた2軸のシーソーのようなものですから、ボールがフィールドの周辺部にいるときに急激にフィールドを傾けると、投石機のようにボールを投げ飛ばすことになるかもしれません。あえてそれをゲーム上のテクニックの一つ(あるいはフィールド外への落下を誘う罠?)として許容するか、あるいは何とかしてその作用を防止するか(回転中心を動的に変える?または力積を無理やり中和して跳ねなくさせる?)といったことを考える必要がありそうです。

投げ飛ばされるボール

投稿2019/07/25 12:14

編集2019/07/25 12:15
Bongo

総合スコア10807

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

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

Beginner3309

2019/07/25 14:15

実際に上記のコードを入力し、挙動を確かめてみました。とても満足のいく仕上がりになっていて、感動しました。ボールが飛んでいく挙動は、ステージづくりの幅が広がる、とても面白いものだと感じました。この挙動は是非ともステージづくりに取り入れていきたいと思います。また、カメラの操作につきましても、アドバイスを頂きありがとうございます。長い間、貴重なお時間を割いてまで手伝って頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問