Saya telah menemukan masalah serupa yang beberapa orang sudah posting di forum. Saya memeriksa posting yang ada tetapi masih tidak dapat memperbaiki masalah. Saya memiliki kubus di program saya yang menyentuh lantai saat program dimulai. Namun, saya menemukan bahwa onCollisionEnter tidak dipanggil saat kubus menyentuh lantai. Benda kaku melekat pada kubus. Adakah yang bisa membimbing saya di mana saya membuat kesalahan?

enter image description here

Kode kubus adalah:

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

public class cube : MonoBehaviour
{
    public float speed = 3.5f;
    public float jumpingforce = 10f;
    private bool canjump = false;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKey("right"))
        {
            transform.position += Vector3.right * speed * Time.deltaTime;
        }

        if(Input.GetKey("left"))
        {
            transform.position += Vector3.left * speed * Time.deltaTime;
        }

        if(Input.GetKeyDown("space"))
        {
            GetComponent<Rigidbody>().AddForce(0,jumpingforce,0);
        }
    }

    void onCollisionEnter(Collision collision)
    {
        Debug.Log("checking collision....");
    }
}
0
user2293224 20 September 2019, 02:10

1 menjawab

Jawaban Terbaik

Pertama-tama OnCollisionEnter perlu dimulai (karena metode apa pun dan nama kelas harus dalam c#) dengan kapital O .. jika tidak, Unity tidak akan mengenalinya dan tidak pernah menyebutnya. Unity memanggil metode ini (seperti juga Awake, Start, Update) sebagai "Pesan". Jika mereka tidak sama persis dengan namanya, mereka tidak akan pernah ditemukan dan tidak pernah dipanggil.


Beberapa hal lagi:

  • Jangan panggil GetComponent berulang kali. Ini cukup mahal! Lebih baik simpan referensi sekali dan gunakan kembali.

  • Kemudian setiap kali Rigidbody terlibat, Anda harus tidak memperbarui transformasinya menggunakan komponen Transform! Ini merusak Fisika! Lebih baik gunakan Rigidbody.MovePosition dalam FixedUpdate

  • Small Sidenote: Hapus semua metode pesan Unity kosong seperti Start, Awake, Update. Bahkan jika mereka kosong, mereka dipanggil oleh Unity sebagai pesan yang hanya menyebabkan overhead yang tidak perlu.

Jadi, Anda harus mengubah kode Anda menjadi sesuatu seperti

public class cube : MonoBehaviour
{
    public float speed = 3.5f;
    public float jumpingforce = 10f;
    private bool canjump = false;

    // you can also already reference this via the Inspector
    // then it skips the GetComponnet call
    [SerializeField] privte Rigidbody rigidbody;

    private void Awake()
    {
        if(!rigidbody) rigidbody = GetComponent<Rigidbody>()
    }

    private void FixedUpdate()
    {
        // Getting this input in FixedUpdate is ok since it is a continues call
        if(Input.GetKey("right"))
        {
            rigidbdy.MovePosition(rigidbody.position + Vector3.right * speed * Time.deltaTime);
        }
        if(Input.GetKey("left"))
        {
            rigidbdy.MovePosition(rigidbody.position + Vector3.left * speed * Time.deltaTime);
        }
    }

    private void Update()
    {
        // this one-time input event has to be checked in Update / frame-based
        // since it is true only for one frame and FixedUpdate might not be called during that frame
        if(Input.GetKeyDown("space"))
        {
            // also it's ok calling this in Update since it is a one-time event
            // and unlikely to happen twice until FixedUpdate is called again
            rigidbody.AddForce(0,jumpingforce,0);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("checking collision....");
    }
}
3
derHugo 20 September 2019, 06:03