坂道を画像のように上る方法が知りたいです。とりあえず次のスクリプトのうに組ましたがうまくできません何を間違えたのか知りたいです。
ベクトルの内積のようなものを取りそこにwalk_speedをかけるとy軸の移動量が判明すると思ったのですがこれはどう違うのでしょうか?
※コメント/////部のコードです。
やりたいこと "平地と同じ移動速度で坂道を上る処理を作りたい。"
質問ですがrayを飛ばすやり方だとその線に反応しない場合はこのコードではうまくいかないため何か別のやり方を考える方法がるのでしょうか?
キャラクターにカプセルコライダー(足元)Rigidbodyも入っています。
質問2、停止中または画像から見て横に動くと下(地面に向かって)下がってしまう原因がしりたい。
提示画像その2
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { const float walk_speed_max = 3.0f; Rigidbody rb; Vector3 move; float input_h; float input_v; Vector3 move_x; Vector3 move_y; public GameObject gGround; ground spt_g; bool isJump; bool isDush; bool isRay; float jump_force = 200.0f; float move_speed = walk_speed_max; Animator ani; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private Transform StepHit; private Transform Hit; private RaycastHit ray; const float ray_range = 0.3f;//レイを飛ばす距離 // 昇れる段差 private float stepOffset = 0.3f; // 昇れる角度 private float slopeLimit = 65f; // 昇れる段差の位置から飛ばすレイの距離 private float slopeDistance = 1f; private Vector3 v; // GameObject go = GameObject.Find("GameObject"); void move_step() { //y軸は逆にしてるプラスが下 Debug.DrawLine(transform.position + new Vector3(0f, stepOffset, 0f), transform.position + new Vector3(0f, stepOffset, 0f) + transform.forward * slopeDistance , Color.green); // Debug.Log(transform.forward * slopeDistance); if (spt_g.isGround == true) { if (Physics.Linecast(StepHit.position, StepHit.position + StepHit.forward * ray_range, out ray)) { Debug.Log("レイ"); if (Vector3.Angle(transform.up, ray.normal) <= slopeLimit || (Vector3.Angle(transform.up, ray.normal) > slopeLimit && !Physics.Linecast(transform.position + new Vector3(0f, stepOffset, 0f), transform.position + new Vector3(0f, stepOffset, 0f) + transform.forward * slopeDistance)) ) { v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, ray.normal) * transform.forward * move_speed).y, 0f) + transform.forward * move_speed; isRay = true; } else { //move += transform.forward * move_speed; } } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Start is called before the first frame update void Start() { rb = GetComponent<Rigidbody>(); spt_g = gGround.GetComponent<ground>(); ani = GetComponent<Animator>(); isJump = false; isDush = false; StepHit = transform.Find("StepRay"); } // Update is called once per frame void Update() { input_h = Input.GetAxis("Horizontal"); input_v = Input.GetAxis("Vertical"); move_y = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * input_v; move_x = Camera.main.transform.right * input_h; move = move_x + move_y; //move.x *= move.x * move_speed; //move.z *= move.z * move_speed; if (move != Vector3.zero) { transform.rotation = Quaternion.LookRotation(move.normalized); } /*走る*/ if(Input.GetKey(KeyCode.RightControl)) { isDush = true; move_speed = 15.0f; } else { isDush = false; move_speed = walk_speed_max; } if(Input.GetKey(KeyCode.Space)) { if(spt_g.isGround == true && isJump == false) { isJump = true; } } move_step(); Animation_Mng(); } /*アニメーション管理*/ void Animation_Mng() { float speed = Mathf.Sqrt((move.x * move.x) + (move.z * move.z)); ani.SetFloat("Move_Speed",speed); ani.SetBool("isDush",isDush); } private void FixedUpdate() { rb.velocity = new Vector3(move.x, rb.velocity.y, move.z); if(isJump == true) { rb.AddForce(rb.velocity.x,jump_force,rb.velocity.z); isJump = false; } rb.AddForce(new Vector3(0, -10.0f, 0)); } private void OnCollisionEnter(Collision c) { // Debug.Log("プレイヤーcollision"); } }
完成形はどういったものをイメージしており、どう「うまくいかない」のでしょうか?
ベクトル成分x,zの積をとってもyの移動量は地面のx,z方向の傾きに依存するので、
y=移動量x*地面のx方向の傾き+移動量z*地面のz軸方向の傾きとする必要がありますが、
画像のゆに坂道を上って下るときも地面にくっついて移動するとなると単に地面に押し付けるだけでは無理なので坂道の上るときに同じ速度で上るための処理を書く必要が出てきました。そこで前に進んでいるときにyの移動量を計算してればスーっと平地と同じ速度で上がる(y)のではないかと考えたのですが
参考サイト: https://gametukurikata.com/program/rigidbodyandcollider です。下記のRigidbodyを使うスクリプト参考に作りました。
うまくいかない、というのはどううまくいかないのでしょうか?
具体的にお願いします。
なぜかrotationは触っていなのになぜかキャラクタがその分?の角度に傾いてしまいます。参考サイトにもありました通りキャラクタの角度は変わらない上昇量の話なのでちょっと困惑しています。
思いもよらない内容でこちらも困惑しております(°_°)
解決に繋がるかは分かりませんが
・どの方向に移動した時に、どの軸にどのぐらい傾くのか?
・コライダーの形状は何か?
を質問に追記していただけると幸いです。
質問ですが参考サイトは正しいのでしょうか?
ざっとみた限り、おかしな点はありませんでしたが、少々回りくどい且つ分かりにくい方法でコードを書いていると感じました。
コード自体を精査はしてませんがコピペではなく、理解して参考にする程度に留めた方が賢明です。
質問ですが坂道に上っているときに横に動くとすこしずつ下がってしまうのですがこれはどうすればいいのでしょうか?
画像を見る限り軸に平行に傾いている様ですが、これをy軸方向に傾けて、異変が無いかもう一度確認してみてください。
ちょっと内容が食い違ってるみたいですので提示画像を追加しました。画像のように坂道に上っているときにy軸が小数点以下の値がすこしずつ下にがってしまっていてz軸もすこしずつ数字が変わっていてすこしずつ
地面に向かって下がっていると見たいです。これは何をしたのでしょうか?
今更ですが坂道を上るコードを編集しました。
float s = Mathf.Sqrt((move.x * move.x) + (move.z * move.z));
if (spt_g.isGround == true && s > 0)
{
if (Physics.Linecast(StepHit.position, StepHit.position + StepHit.forward * ray_range, out ray))
{
if (Vector3.Angle(transform.up, ray.normal) <= slopeLimit)
{
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, ray.normal) * transform.forward * move_speed).y, 0f)
+ transform.forward * move_speed;
isRay = true;
}
else
{
//move += transform.forward * move_speed;
}
}
}
坂道が横に傾いているわけでは無いですよね?
Scaleメソッドの戻り値が問題だと思うので、x、z共に傾きがある状態で再度検証していただきたい→坂をy軸に傾けて欲しいのです。
長くなったので、新たな質問として別の人にも回答を促した方がいいと思います。
回答1件
あなたの回答
tips
プレビュー