0
私はまだユニティを学んでおり、今は自分のプレイヤーをジャンプできるようにしようとしています。もちろん私はプレイヤーが永遠に飛び越えることを望んでいないので、私の考えは、プレイヤーがフロアオブジェクトに接触しているときにのみジャンプを可能にすることでした。これは私がこれまで持っているコードです:プレイヤーと地面の衝突を検出するUnity3D
public class PlayerController : NetworkBehaviour
{
public float speed; // Player movement speed
private bool grounded = true; // Contact with floor
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
// Show a different color for local player to recognise its character
public override void OnStartLocalPlayer()
{
GetComponent<MeshRenderer>().material.color = Color.red;
}
// Detect collision with floor
void OnCollisionEnter(Collision hit)
{
if (hit.gameObject.tag == "Ground")
{
grounded = true;
}
}
// Detect collision exit with floor
void OnCollisionExit(Collision hit)
{
if (hit.gameObject.tag == "Ground")
{
grounded = false;
}
}
void FixedUpdate()
{
// Make sure only local player can control the character
if (!isLocalPlayer)
return;
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement * speed);
// Detect space key press and allow jump if collision with ground is true
if (Input.GetKey("space") && grounded == true)
{
rb.AddForce(new Vector3(0, 1.0f, 0), ForceMode.Impulse);
}
}
}
しかし、OnCollisionEnter
とOnCollisionExit
が引き金と決してそうです。だから、プレイヤーはいつでも彼が望むときにジャンプすることができます。私は何か間違っているのですか?
編集:OnCollisionEnter
とOnCollisionExit
が完全に正常にトリガーされたようです。 if文がfalseを返すだけです。なぜ私は考えていない。
if (GameObject.Find("Ground") != null)
がtrueを返しました。
編集2:これらの戻りUntagged
の両方不思議なこと:
Debug.Log(hit.gameObject.tag);
Debug.Log(hit.collider.tag);
私はオブジェクト名とオブジェクトタグを混同していました。地上のオブジェクトには本当にタグがありませんでした。私はそのタグを追加して、すべてが完璧に機能しました!私は自分でそれに答えるつもりでしたが、私はあなたの代わりに受け入れます:) – icecub
ありがとうございました。あなたのプロジェクトで最高のもの –