2017-09-01 56 views
0
public float slowAmount; 
public float effectDuration = 3f; 

private Dictionary<GameObject, float> dragDic = new Dictionary<GameObject, float>(); 
private Dictionary<GameObject, float> angDic = new Dictionary<GameObject, float>(); 

private Dictionary<GameObject, KeyValuePair<float, float>> DragDic = new Dictionary<GameObject, KeyValuePair<float, float>>(); 

void OnTriggerEnter(Collider coll) 
{ 
    if (coll.gameObject.GetComponent<InteractiveObjectType>() != null) 
    { 
     GameObject targetGo = coll.gameObject; 
     Rigidbody targetRB = targetGo.GetComponent<Rigidbody>(); 

     dragDic.Add(targetGo, targetRB.drag); 
     angDic.Add(targetGo, targetRB.angularDrag); 
    } 

     **// drag manipulation happens here** 

} 

void OnTriggerExit(Collider coll) 
{ 
    GameObject targetGo = coll.gameObject; 
    Rigidbody targetRB = targetGo.GetComponent<Rigidbody>(); 


    for (int i = 0; i < dragDic.Count; i++) 
    { 
     foreach (float target in dragDic.Values) 
     { 
      targetRB.drag = target; 
     } 
    } 

    for (int i = 0; i < angDic.Count; i++) 
    { 
     foreach (float target in angDic.Values) 
     { 
      targetRB.angularDrag = target; 
     } 
    } 

    dragDic.Clear(); 
    angDic.Clear(); 
} 

所以,當物體進入該觸發收集某些變量(在這種情況下,它的風阻和angularDrag),並將其存儲到OnTriggerExit返回其存儲的值是什麼,我想在這裏實現的。此外,我正在嘗試這樣做,因爲我想在OnTriggerEnter的這裏更改這些值,並使它們在之後返回原始狀態。創建字典和返回值

但是,我並沒有把所有的對象都取回來,但只有其中一個取回了它。

編輯:看起來我的解釋比我想象的更差,所以讓我再試一次。 這個問題是由一個簡單的機制發生的,我試圖通過一個簡單的機制來操縱一個rigidBody的drag和angularDrag。然而,同時這個觸發器中可能有很多gameObjects,它內部的gameObjects具有不同的drag和angularDrag值,我看到它需要臨時存儲並在OnTriggerExit上返回它們。我現在所在的地方是,在操作機制發生完成後,我將其中一個gameObject作爲其「舊值」返回,但其餘的都停留在該狀態而未恢復原始值。

+0

目前尚不清楚你的問題是什麼。我所知道的是當碰撞發生時你想存儲它們。你想在觸發器退出時發生什麼? – Programmer

+0

將存儲的值返回給ganeObjects。如果3個ganeObjects A,B和C'進入'存儲它們的值並在'退出'時返回它們。 –

+0

我想我明白....恢復角度和angulardrag回到字典中的每個遊戲對象?如果是這樣,這應該發生在當前GameObject('Collider coll')或**字典中的每個** GameObject? – Programmer

回答

2

你的代碼有幾個問題。

.Don't忘記必須在OnTriggerExit太就像你在OnTriggerEnter功能做if (coll.gameObject.GetComponent<InteractiveObjectType>() != null)

。我注意到你正在使用不同的字典來存儲拖動和角度拖動。你不必這樣做。只需使用一個字典和一個包含拖動和角度拖動值的struct

它應該看起來像下面的東西:

public struct DragInfo 
{ 
    public float drag; 
    public float angularDrag; 

    //Initialize the variables 
    public DragInfo(float drag, float angularDrag) 
    { 
     this.drag = drag; 
     this.angularDrag = angularDrag; 
    } 
} 

。你不必清除字典。你甚至不必循環它。如果TryGetValue函數返回true,只需刪除在OnTriggerExit函數中檢測到的每個單獨函數。

這是整個代碼應該是什麼樣子與DragInfo結構:

public struct DragInfo 
{ 
    public float drag; 
    public float angularDrag; 

    //Initialize the variables 
    public DragInfo(float drag, float angularDrag) 
    { 
     this.drag = drag; 
     this.angularDrag = angularDrag; 
    } 
} 

public float slowAmount; 
public float effectDuration = 3f; 

private Dictionary<GameObject, DragInfo> dragInfo = new Dictionary<GameObject, DragInfo>(); 

void OnTriggerEnter(Collider coll) 
{ 
    Rigidbody targetRB; 

    if (coll.gameObject.GetComponent<InteractiveObjectType>() != null) 
    { 
     GameObject targetGo = coll.gameObject; 
     targetRB = targetGo.GetComponent<Rigidbody>(); 

     //Create new DragInfo with the current Object 
     DragInfo dragDetail = new DragInfo(targetRB.drag, targetRB.angularDrag); 

     //Add it to the Dictionary 
     dragInfo.Add(targetGo, dragDetail); 
    } 

    //drag manipulation happens here** 
    //targetRB.drag = ??? 
    //targetRB.angularDrag = ??? 
} 

void OnTriggerExit(Collider coll) 
{ 
    GameObject targetGo = coll.gameObject; 
    Rigidbody targetRB = targetGo.GetComponent<Rigidbody>(); 

    if (coll.gameObject.GetComponent<InteractiveObjectType>() != null) 
    { 
     //Where to store retrieved Object 
     DragInfo storedDragInfo; 

     //Retrieve and Check if the Object exist in the Dictiionry 
     if (dragInfo.TryGetValue(targetGo, out storedDragInfo)) 
     { 
      //Restore the current value of the detected GameObject 
      targetRB.drag = storedDragInfo.drag; 
      targetRB.angularDrag = storedDragInfo.angularDrag; 

      //Remove it from the Dictionary 
      dragInfo.Remove(targetGo); 
     } 
    } 
} 

注意DragInfostructclass。確保將其保存爲struct以避免每次都分配內存。

+1

Gosh,非常感謝!這不僅是解決問題的良好答案,而且還教會我更多!謝謝!好了解! ; D –

+0

不客氣。我看到使用多個字典後必須留下答案。快樂的編碼! – Programmer

+1

是啊...我是一個自學成才的初學者,所以有很多基礎性的東西,我做的不錯...哈哈。 –

1

要獲得存儲的值只使用gameObject作爲重點:

GameObject targetGo = coll.gameObject; 
Rigidbody targetRB = targetGo.GetComponent<Rigidbody>(); 
if (targetGo.GetComponent<InteractiveObjectType>() != null){ 
    targetRB.drag = dragDic[targetGo]; 
    targetRB.angularDrag = angDic[targetGo]; 
} 

使用dragDic.Remove(targetGo)angDic.Remove(targetGo)從字典中刪除遊戲對象。

+0

感謝您的幫助!但是,它拋出了我KeyNotFoundException。我猜,因爲我有多個目標,你的代碼隱含在字典中的單一目標。 –

+0

在嘗試獲取值之前加上'if(coll.gameObject.GetComponent ()!= null)'或'if(dragDic.ContainsKey(targetGo))'檢查 – Pluto