0

長い話を短く、PickAxeTestManagerは、私が取得しています、私は、オブジェクトプーリングシステムを作成していますし、私のスクリプトで(下記参照)エラーCS1501ライン上に「0の引数を取りOnTriggerEnter方法はありませんオーバーロード」22OnTriggerEnterを呼び出すときのNull参照?

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が "South Wall"に当たったときにプーリングシステムに戻したいので、このスクリプトを持っています(しかし、今のところ、ロジックが分かりました)。

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

    } 

} 
} 

私の質問は:私はこの「null参照」を取り除くことができるように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 
    } 
} 
} 

詳細が必要な場合は、私にお知らせください。ありがとうございました! :)

答えて

2

まず

(ResetByWall.instance.OnTriggerEnter())//エラーCS1501は、ここにある場合。 "メソッドOnTriggerEnterのオーバーロードが0引数を取る"。

"OnTriggerEnter"は何も返しません(void)ので、ifブロックで使用することはできません。

第二

私の質問は:私はこの「null参照」を取り除くことができるように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; 
} 
+0

ありがとうございました!遅い回答をおかけして申し訳ありませんが、私は過去2〜3日間はあまりプログラムできませんでした。私はこの特定の部分について私のプーリングシステムに関する問題を解決する方法を考え出しましたが、親切に私を助けてくれました。私はまだ私のプーリング・システムに関していろいろ試していますが、あなたはこの面で私を助けてくれました。ありがとうございました!素晴らしい週末を過ごす:) @RamazanKürkan –

関連する問題