无法弄清楚为什么我的脚本无法注册冲突

问题描述 投票:0回答:1

我觉得这有助于说明我使用此脚本的目标是什么。 我正在尝试制作 Rocket Landing 游戏。你从一个垫子开始,基本上有一个受控的下降,直到你着陆 - 玩家可以单击鼠标左键以激活推进器以在屏幕上向鼠标的方向移动。 (我对游戏中的推进器/物理运动没有任何问题......只是碰撞检测。)

这个特定的脚本是为了:

  1. 检测碰撞
  2. 具体检测碰撞物体。 (绿色、黄色、红色着陆垫或地面)
  3. 一旦发生碰撞,立即停止所有物理和运动。 (把它想象成游戏/应用程序的背景。一旦你着陆,一切都会冻结,游戏管理器将显示一个显示你的分数的窗口,以及 2 个用于重试或退出的按钮。

“火箭”上有一个刚体,但“火箭”是一个空对象,它是“推进器”的父级,而“推进器”是“火箭体”的父级。

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;
        }

    }
}
c# unity3d game-development
1个回答
0
投票

确保火箭和发射台都有未标记为触发器的碰撞器,并且标签正确放置在实际具有碰撞器的对象中

© www.soinside.com 2019 - 2024. All rights reserved.