我觉得这有助于说明我使用此脚本的目标是什么。 我正在尝试制作 Rocket Landing 游戏。你从一个垫子开始,基本上有一个受控的下降,直到你着陆 - 玩家可以单击鼠标左键以激活推进器以在屏幕上向鼠标的方向移动。 (我对游戏中的推进器/物理运动没有任何问题......只是碰撞检测。)
这个特定的脚本是为了:
“火箭”上有一个刚体,但“火箭”是一个空对象,它是“推进器”的父级,而“推进器”是“火箭体”的父级。
Rocket(有刚体,无对撞机) -> 推进器(无刚体,有盒对撞机) ->->RocketBody(没有刚体,有盒子对撞机)
其他信息。刚体是动态的,不是运动学的,在这个场景中没有任何东西'IsTrigger'意味着任何着陆垫或地面---尽管我试图让它们全部触发以查看它是否会记录碰撞。
我知道我想在发生任何碰撞时将火箭的刚体设置为运动学。我只是不明白为什么尽管火箭有 RB,但我什至无法检测到碰撞。
这是代码——我对自己的编码能力不是很有信心,所以我确实倾向于尝试我能做的一切并减少后端的脂肪,所以我对我失踪的想法持开放态度一些非常基本的东西。如果您看到的只是一团乱麻,请提前致歉。也很抱歉,发送单个屏幕截图太多了,但不足以证明 2.
-下面的代码-
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LandingBehaviour : MonoBehaviour
{
[SerializeField]
private bool _greenPad;
[SerializeField]
private bool _yellowPad;
[SerializeField]
private bool _redPad;
[SerializeField]
private bool _ground;
private bool _crash = false;
private float _score = 1;
[SerializeField]
private Rigidbody _rigidBody;
private void Awake()
{
_rigidBody = GetComponent<Rigidbody>();
}
private void OnCollisionEnter(Collision collision)
{
Debug.Log("A collision has occurred.");
//_rigidBody = GetComponent<Rigidbody>();
_rigidBody.isKinematic = false;
if (!collision.gameObject.CompareTag("LandingPad") || !collision.gameObject.CompareTag("Ground"))
{
return;
}
if (collision.gameObject.transform.rotation.z >= 45 || collision.gameObject.transform.rotation.z <= -45)
{
_crash = true;
}
if (collision.gameObject.CompareTag("LandingPad"))
{
if (_greenPad)
{
Debug.Log("Green Landing Pad Found.");
_score *= 2;
}
if (_yellowPad)
{
Debug.Log("Yellow Landing Pad Found.");
_score *= 3;
}
if (_redPad)
{
Debug.Log("Red Landing Pad Found.");
_score *= 5;
}
}
if (collision.gameObject.CompareTag("Ground"))
{
Debug.Log("Ground Found.");
_score *= 1;
}
}
}
确保火箭和发射台都有未标记为触发器的碰撞器,并且标签正确放置在实际具有碰撞器的对象中