バージョン: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!"); } } }
回答2件
あなたの回答
tips
プレビュー