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

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

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

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

Q&A

解決済

2回答

4233閲覧

重力に逆らい、球面にそって垂直に歩かせてみるがうまくいかない

kudo201810

総合スコア30

Unity3D

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

0グッド

1クリップ

投稿2020/09/09 00:56

編集2020/09/11 00:45

バージョン:Unity 2019.2.11f1 (64-bit)

以下のサイト
Unity:重力に逆らい、球面にそって垂直に歩かせてみる
https://indie-du.com/entry/2017/01/24/200000

球面にそって動かしているのですがゲーム再生後すぐに

を押しっぱなしだと球面にそって歩くことができるのですが

ゲーム再生後、
右や左に回転したあと

を押して進むと途中で
へんな態勢になってしまい
球面から離れておかしな動きになってしまいます。

【追記】
初期のローテーションがすべて0の場合は、上を押し続けると球面を回転できるのですが
初期のローテーションが0以外(少しでも回転している)と上を押し続けるとおかしな状態(姿勢がおかしくなり空中を歩く)

右や左に回転したあと上で前方にすすんでも
ちゃんと球面にそって歩かせたいのですが
自分でいろいろな試行錯誤をしたのですがうまくいきませんでした。

よい方法がありましたらぜひ回答をお願いしたいです。

以下のようになります
イメージ説明

ソースは以下

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GravityFreeAgent_src : MonoBehaviour { public float speed = 0.4f; public float Rspeed = 0.5f; public float hit_distance = 0.49f;//元は0.05f [SerializeField] Transform CenterOfBalance; // 重心 Animator anim; Vector3 vec = new Vector3(0, -1f, 0); public float r = 0.2f; void Start() { anim = GetComponent<Animator>(); } void Update() { // キーボード入力で移動、回転 if (Input.GetKey(KeyCode.LeftArrow)) { transform.Rotate( new Vector3(0, -Rspeed, 0), Space.Self ); } else if (Input.GetKey(KeyCode.RightArrow)) { transform.Rotate( new Vector3(0, Rspeed, 0), Space.Self ); } else if (Input.GetKey(KeyCode.UpArrow)) { transform.position = transform.position + (transform.forward * speed * Time.fixedDeltaTime); //歩くアニメーション anim.SetBool("run_f",true); } else if (Input.GetKey(KeyCode.DownArrow)) { transform.position = transform.position + (transform.forward * speed * Time.fixedDeltaTime); } if (Input.GetKeyUp(KeyCode.UpArrow)) { //待機アニメーション anim.SetBool("run_f", false); } RaycastHit hit; // Transformの真下の地形の法線を調べる if (Physics.SphereCast( CenterOfBalance.position, r, - transform.up, out hit, float.PositiveInfinity)) { Debug.Log(hit.collider.name+hit.distance); //// 傾きの差を求める Quaternion q = Quaternion.FromToRotation( transform.up, hit.normal); // 自分を回転させる transform.rotation *= q; // 地面から一定距離離れていたら落下 if (hit.distance > hit_distance) { transform.position = transform.position + (vec * Physics.gravity.magnitude * Time.fixedDeltaTime); } } else { Debug.Log("no hit root!"); } } }

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

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

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

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

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

sakura_hana

2020/09/10 02:08

・「へんな態勢」「おかしな動き」とは具体的にどういう状態なのか(スクリーンショットがあるとよい) ・ソースコードは参考サイトのものをそのまま使っているのか ・何かエラーは発生していないか (・質問文が途切れているのでその修正) などの情報を記載すると回答が付きやすいかと思います。以下も参考にして質問を編集してください。 https://teratail.com/help/question-tips
kudo201810

2020/09/10 03:00

画像を追記しました
kudo201810

2020/09/10 03:08

ソースも追記しました
guest

回答2

0

ベストアンサー

英語の解説動画がいくつかありました。
Unityの操作やコードがほとんどなので英語が分からなくても何をやっているか分かると思います。

動画で全部解説

Githubにソースがある解説

↑のソースを使う解説

投稿2020/09/11 12:14

shiena

総合スコア1825

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

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

kudo201810

2020/09/11 21:47

ありがとうございます。できました!
guest

0

こんにちは!

他のオブジェクトの表面に沿ってオブジェクトを移動させる

【UnityC#講座】キューブの周りを張り付いて移動できるようにした

こういったサイトは参考になりますでしょうか?
ぜひご一見ください。

投稿2020/09/09 01:56

cushionA

総合スコア90

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

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

kudo201810

2020/09/09 02:46

キャラクターコントローラを使用しない方法でお願いします。 しかも、このサイト、キューブとなっています。球です。
fiveHundred

2020/09/11 12:59

キャラクターコントローラを使用するなとは質問文に書かれていないですし、後者のリンクはともかく、前者ではキャラクターコントローラは使っていませんし球でも応用できそうです。 正直これで低評価はあまりに酷すぎるので相殺しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問