2017-04-14 82 views
1

我想知道如何根據2個物體之間的距離製作平滑的彩色lerp。顏色應該從綠色到紅色到綠色到紅色...立方體遠=紅色,立方體近=綠色。基於2個物體之間的距離的Lerp顏色

我已經得到了一切工作,但唯一認爲不工作的是顏色不平滑的事實。這是目前的樣子。 https://i.gyazo.com/a85852e76d2418ab7d44c18e152647c0.mp4

我使用這個腳本的顏色變化:

FindClosestCube(); 
    float lerpProgress = 0f; 
    GameObject cubeChildTop = null; 
    GameObject closestCube = FindClosestCube(); 
    cubeChildTop = closestCube.transform.Find("Top").gameObject; 

    if (cubeDiffX >= 0.8f || cubeDiffX <= -0.8f) 
    { 
     lerpProgress = 0.5f; 
    } 
    if (cubeDiffX <= 0.8f || cubeDiffX <= -0.8f) 
    { 
     lerpProgress = 1f; 
    } 
    if (cubeDiffX >= 1.6f || cubeDiffX <= -1.6f) 
    { 
     lerpProgress = 0f; 
    } 
    if(closestCube != GameObject.Find("Cube (1)2")) 
    { 
     cubeChildTop.GetComponent<Renderer>().material.color = Color.Lerp(redColor, greenColor, lerpProgress); 
    } 

所以...我怎麼讓它lerping順利從紅色到綠色的嗎?

+0

酷酷的尋找遊戲BTW –

+0

@K Scandrett,非常感謝!每個級別都有他自己的主題。 – Jip1912

回答

1

這真的很容易。

。找出你認爲這兩個物體可以分開的最大距離。

您需要做的第一件事是確定這兩個GameObjects將分開的最大距離值。您需要將該值傳入mapValue函數的inValueMax參數#2

您可以確定最大值與此代碼:

public GameObject obj1; 
public GameObject obj2; 

void Update() 
{ 
    UnityEngine.Debug.Log(getSqrDistance(obj1.transform.position, obj2.transform.position)); 
} 

public float getSqrDistance(Vector3 v1, Vector3 v2) 
{ 
    return (v1 - v2).sqrMagnitude; 
} 

運行它,再用手將每個對象/立方,然後同時獲得對象可以相互旅行與Debug.Log消息的最高值。

看着你發佈的視頻我估計200的距離值很好,但如果你想要一個完美的結果,你仍然必須用上面的腳本做實驗。

。使用的map轉換0MAX_DISTANCE距離範圍0f1f範圍

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax) 
{ 
    return (mainValue - inValueMin) * (outValueMax - outValueMin)/(inValueMax - inValueMin) + outValueMin; 
} 

它倍一些特定點之間的值到另一個。

例如,您需要使用Lerp函數來執行此操作,並且Lerp函數將採用01值。 mapValue函數可以將任何數字縮放到函數所需的01之間的範圍。

對於我來說,我會擴展到0範圍2000f1f範圍與mapValue功能。

。最後,在顏色之間使用Color.Lerp(near, far, lerp);來識別。 lerp值是#2的結果值。


代碼

一旦你找到#1,該值插頭從腳本MAX_DISTANCE變量下面應該工作:

public GameObject obj1; 
public GameObject obj2; 

Color near = Color.green; 
Color far = Color.red; 
const float MAX_DISTANCE = 200; 

void Update() 
{ 

    //Get distance between those two Objects 
    float distanceApart = getSqrDistance(obj1.transform.position, obj2.transform.position); 
    UnityEngine.Debug.Log(getSqrDistance(obj1.transform.position, obj2.transform.position)); 

    //Convert 0 and 200 distance range to 0f and 1f range 
    float lerp = mapValue(distanceApart, 0, MAX_DISTANCE, 0f, 1f); 

    //Lerp Color between near and far color 
    Color lerpColor = Color.Lerp(near, far, lerp); 
    obj1.GetComponent<Renderer>().material.color = lerpColor; 
} 

public float getSqrDistance(Vector3 v1, Vector3 v2) 
{ 
    return (v1 - v2).sqrMagnitude; 
} 

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax) 
{ 
    return (mainValue - inValueMin) * (outValueMax - outValueMin)/(inValueMax - inValueMin) + outValueMin; 
} 

結果

+1

感謝您付出如此多的努力!它完美的工作!順便說一句。你用什麼程序來做gif? – Jip1912

+0

不錯。我使用LICEcap捕獲屏幕。 – Programmer

1

看來你是混淆了lerp的概念。當你申請lerp時,lerpProgress應該是[0,1]中的連續值,以使其順利變化。在你的caes中,你將它們設置爲0,0.5,1.0,這就是顏色顯得不平滑的地方。

請記住,lerp(線性插值)將兩個值相加,每個值具有不同的貢獻率。所以,如果你有Color AColor B你想lerp,你說我想要A的40%和B的60%,並混合起來。

每個實例應該有多少貢獻率完全取決於你,它是你設計遊戲的地方。

我能想到的一種方法是根據距離。如果ZXY之間移動,則存在兩個距離比XZYZ。例如,如果Z爲朝向X的40%(0.4f)和朝向Z的60%(0.6f),則例如,可以獲得X的顏色值的40%和顏色值的60%。

這個想法不僅限於2個對象,但可以擴展到N個對象。

編輯:

這裏是你如何能夠從只有X值獲得比一個例子。在這個例子中,我假定了兩個預定義的minX和maxX值。

這個想法是考慮leftX作爲出發點。如果x == left.x,則返回0,如果x == right.x,則返回1.

float GetDistanceRatio() 
{ 
    float maxDistance = maxX - minX; 
    float distanceFromLeft = currX - minX; 
    float distanceFromLeftRatio = distanceFromLeft/maxDistance; 

    return distanceFromLeftRatio; 
} 
+0

我可以理解你的意思,但我不明白我會怎麼做我的腳本?順便說一句。只有「x」在翻譯。 – Jip1912

+0

請檢查編輯後的答案中的代碼段。這是一個如何計算lerp的典型例子。如果你正在尋找更具體的答案,讓我知道你想如何實現它。 – BrokenBacon

+0

感謝您的解釋,它解決了! – Jip1912