簡體   English   中英

OnCollisionEnter不工作Unity3D

[英]OnCollisionEnter not working Unity3D

我正在嘗試構建一個你需要躲避掉落物體的游戲。 我做了一個危險但似乎危險'克隆'表現得很差。

當危險發生在它需要消失的平台上時,我制作了一個碰撞腳本。 這適用於危險對象,但不適用於墜落的危險克隆對象。

  • 正如您在第一個屏幕截圖中看到的那樣,紅色圓圈塊的行為類似於它。 但藍色的圓圈一次(克隆)直接穿過物體。
  • 正如你在第二個截圖中看到的那樣,紅色圓圈的一個已經消失,因為它擊中了平台。 但是藍色曾經一度落空。

提前致謝!

在此輸入圖像描述 在此輸入圖像描述

在下面你會找到碰撞腳本,下面是Hazard Spawn腳本:

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

 public class HazardCollisionFunctions : MonoBehaviour {

 #region Variables
 //Public

 //Private
 #endregion

 #region UnityFunctions
 void Start()
 {

 }
 void Update()
 {

 }
 #endregion

 private void OnCollisionEnter(Collision collision)
 {
     if(collision.gameObject.tag == "platform")
     {
         this.gameObject.SetActive(false);
     }

     if(collision.gameObject.tag == "Player")
     {

     }
 }
 }

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

public class SpawnHazards : MonoBehaviour {

#region Variables
//Public

//Private
[SerializeField]
public float minX = 0.0f;
[SerializeField]
public float maxX = 0.0f;
[SerializeField]
private GameObject[] hazards;        //potential array of hazards
[SerializeField]
private float timeBetweenSpawns = 0.0f;
private bool canSpawn = false;
private int amountOfHazardsToSpawn = 0;
private int hazardToSpawn = 0;
#endregion

#region UnityFunctions
public void Start()
{
    canSpawn = true;    //Temp start
}
public void Update()
{
    if(canSpawn == true)
    {
        StartCoroutine("GenerateHazard");
    }
}
#endregion

private IEnumerator GenerateHazard()
{
    canSpawn = false;
    timeBetweenSpawns = Random.Range(0.5f, 2.0f);       //Testing values
    amountOfHazardsToSpawn = Random.Range(1, 5);        //Testing values
    for(int i = 0; i < amountOfHazardsToSpawn; i ++)
    {
        Vector3 spawnPos = new Vector3(Random.Range(minX, maxX), 8.0f, 0.0f);   //Gen spawnpoint for the hazard
        Instantiate(hazards[hazardToSpawn], spawnPos, Quaternion.identity);     //Spawn the hazard
    }
    yield return new WaitForSeconds(timeBetweenSpawns);
    canSpawn = true;
}
}

OnCollisionEnter

OnCollisionEnterCollision對象作為參數,它要求附加的Collider組件的isTrigger屬性為FALSE

void OnCollisionEnter(Collision collision)
{
    foreach (ContactPoint contact in collision.contacts)
    {
        Debug.DrawRay(contact.point, contact.normal, Color.white);
    }
}

OnTriggerEnter

OnTriggerEnterCollider對象作為參數,並且它要求所連接的Collider組件的isTrigger屬性為TRUE

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("CheckPoint"))
    {
        Destroy(other.gameObject);
    }
}

  1. 如果要從prefab中實例化對象,請確保prefab具有所需的組件( rigidbody / collider )和屬性以實現所需的行為。

  2. 要檢測碰撞/觸發,至少有一個對象必須具有物理組件( Rigidbody

  3. 必須將剛體連接到移動物體上。


希望這可以幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM