Прежде всего 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....");
}
}