Unity3d: проблема с OnCollisionEnter - PullRequest
0 голосов
/ 20 сентября 2019

Я сталкивался с подобной проблемой, о которой мало кто уже писал на форуме.Я проверил существующие сообщения, но все еще не смог исправить проблему.В моей программе есть куб, который падает на пол при запуске программы.Однако я обнаружил, что onCollisionEnter не вызывается, когда куб падает на пол.Твердое тело прикреплено к кубу.Кто-нибудь может подсказать мне, где я совершаю ошибку?

enter image description here

Код куба:

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....");
    }
}

1 Ответ

3 голосов
/ 20 сентября 2019

Прежде всего OnCollisionEnter необходимо запустить (как, впрочем, любой метод и имя класса в c #) с заглавной буквы O .. в противном случае Unity не распознает егои никогда не называй это.Unity вызывает эти методы (как и Awake, Start, Update) как «Сообщения».Если они не совпадают точно с именем, они никогда не будут найдены и никогда не будут вызваны.


Некоторые другие вещи:

  • Не звоните GetComponent несколько раз.Это довольно дорого!Скорее сохраните ссылку один раз и используйте ее снова.

  • Тогда всякий раз, когда задействовано Rigidbody, вы должны не обновлять его преобразования, используя компонент Transform!Это ломает физику!Вместо этого используйте Rigidbody.MovePosition в пределах FixedUpdate

  • Small Sidenote: Удалите любой пустой метод сообщения Unity, например Start, Awake, Update.Даже если они пусты, они вызываются Unity как сообщение, вызывающее только ненужные издержки.

Так что вы должны изменить свой код на что-то вроде

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....");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...