Нулевая ссылка при вызове OnTriggerEnter?

Короче говоря, я создаю систему пула объектов и в своем скрипте (см. ниже) PickAxeTestManager получаю ОШИБКУ CS1501 "Нет перегрузки для метода OnTriggerEnter принимает 0 аргументов" в строке 22.

using UnityEngine;
using System.Collections;

public class PickAxeTestManager : MonoBehaviour {

public GameObject PickAxeprefab;

void Start ()
{
    PickAxePoolManager.instance.CreatePool (PickAxeprefab, 2); //CreatePool is a method in PickAxePoolManager
}


void Update () 
{

    if (Input.GetKeyDown (KeyCode.A)) 
    {
        PickAxePoolManager.instance.ReuseObject(PickAxeprefab, Vector3.zero, Quaternion.identity); //ReuseObject is also a method in PickAxePoolManager 
    }

    if (ResetByWall.instance.OnTriggerEnter()) //ERROR CS1501 is here. "No overload for method OnTriggerEnter takes 0 arguments". 
    {
        PickAxePoolManager.instance.ReuseObject(PickAxeprefab, Vector3.zero, Quaternion.identity); // Same here...      
    }
}
}

Вот мой сценарий ResetByWall (ниже), у меня есть этот сценарий, потому что когда мой PickAxe попадает в "Южную стену", я хочу, чтобы он вернулся в систему пула (но пока я просто "уничтожаю" его, пока я не получу) логика разобралась).

using UnityEngine;
using System.Collections;

public class ResetByWall : MonoBehaviour {

public bool collided;

//NOTE:
//Singleton Pattern from lines 12 to 25 //
// ************************************

static ResetByWall _instance; // Reference to the Reset By Wall script

public static ResetByWall instance  // This is the accessor
{
    get 
    {
        if(_instance == null)   // Check to see if _instance is null
        {
            _instance = FindObjectOfType<ResetByWall>(); //Find the instance in the Reset By Wall script in the currently active scene
        }

        return _instance;
    }
}

//public GameObject prefab;

public void OnTriggerEnter(Collider other) {

    collided = true;

    if (other.gameObject.tag == "Pick Axe_PoolerTest") //I tagged the prefab as "Pick Axe_PoolerTest"
    {
        Debug.Log("Pick Axe entered the trigger!");

        Destroy(other.gameObject);

    }

}
}

Мой вопрос: может ли OnTriggerEnter принять аргумент, который не относится к типу коллайдера, чтобы я мог избавиться от этой "нулевой ссылки"? Я провел много исследований, прежде чем задал этот вопрос, и я ничего не смог найти!

Кроме того, ниже приведен мой сценарий PickAxePoolManager (это основная основа всего, над чем я сейчас работаю), но я уверен, что единственные части этого сценария, на которые вы МОЖЕТЕ обратить внимание, - это методы CreatePool и ReuseObject.

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

public class PickAxePoolManager : MonoBehaviour {

Dictionary<int,Queue<GameObject>> poolDictionary = new Dictionary<int,Queue<GameObject>>();

//NOTE: 
//Singleton Pattern used from lines 12 to 25

static PickAxePoolManager _instance; // Reference to the Pool Manager script

public static PickAxePoolManager instance   // This is the accessor
{
    get 
    {
        if(_instance == null)   // Check to see if _instance is null
        {
            _instance = FindObjectOfType<PickAxePoolManager>(); //Find the instance in the Pool Manager script in the currently active scene
        }

        return _instance;
    }
}

/// <summary>
/// Creates the pool.
/// </summary>
/// <param name="prefab">Prefab.</param>
/// <param name="poolSize">Pool size.</param>

public void CreatePool(GameObject prefab, int poolSize)
{
    int poolKey = prefab.GetInstanceID ();  // Unique integer for every GameObject

    if (!poolDictionary.ContainsKey (poolKey))   //Make sure poolKey is not already in the Dictionary, 
        //if it's not then we can create the pool 
    {
        poolDictionary.Add(poolKey, new Queue<GameObject>());

        for (int i = 0; i < poolSize; i++)  //Instantiate the prefabs as dictated by the "poolSize" integer
        {
            GameObject newObject = Instantiate (prefab) as GameObject;  //Instantiate as a GameObject
            newObject.SetActive(false);  // Don't want it to be visible in the scene yet
            poolDictionary [poolKey].Enqueue(newObject);    // Add it to our Pool
        }
    }
}

/// <summary>
/// Reuses the object in our pool.
/// </summary>
/// <param name="prefab">Prefab.</param>
/// <param name="position">Position.</param>
/// <param name="rotation">Rotation.</param>

public void ReuseObject (GameObject prefab, Vector3 position, Quaternion rotation)
{
    int poolKey = prefab.GetInstanceID ();  // Get our pool key once again

    if (poolDictionary.ContainsKey (poolKey)) // Quick check to make sure our pool dictionary contains the pool key
    {
        GameObject objectToReuse = poolDictionary[poolKey].Dequeue(); //Get the next object in the pool
        poolDictionary[poolKey].Enqueue(objectToReuse); // Add the object back onto the end of the queue so it can be reused later

        objectToReuse.SetActive(true);  //Make sure the object was not disabled

        objectToReuse.transform.position = position; // set position to applied values
        objectToReuse.transform.rotation = rotation; // set rotation to applied values
    }   
}
}

Если вам нужно больше деталей, просто дайте мне знать. Спасибо!:)

1 ответ

Решение

Во-первых,

if (ResetByWall.instance.OnTriggerEnter ()) // ОШИБКА CS1501 здесь. Msgstr "Нет перегрузки для метода OnTriggerEnter не принимает 0 аргументов".

"OnTriggerEnter" не возвращает ничего (void), поэтому использование его в блоке if невозможно.

Во-вторых,

Мой вопрос: может ли OnTriggerEnter принять аргумент, который не относится к типу коллайдера, чтобы я мог избавиться от этой "нулевой ссылки"?

Если вы хотите использовать внутреннюю систему Unity, это должен быть "тип коллайдер". Однако, если ваше использование "OnTriggerEnter" не требует взаимодействия с внутренней физической системой Unity, то вы всегда можете выполнить перегрузку функций в C#.

public boolean OnTriggerEnter(){
    // Internal logic
    return true/false;
}

public boolean OnTriggerEnter(Collider other){
    // Internal logic
    return true/false;
}

public boolean OnTriggerEnter(GameObject target){
    // Internal logic
    return true/false;
}
Другие вопросы по тегам