我正在嘗試為unity制作我自己的移動解決方案。 以下是代碼:
private void Update()
{
//Movement[/span]。
HandleMouseLooking(canLook); //HandleMouseLooking()應該在HandleMoving()之前進行。
HandleMoving(canMove); //HandleMoving()和HandleCrouching()有相同的重要性,所以這并不重要。
HandleCrouching(canCrouch)。
HandleLedgeClimbing(canClimb);
HandleSprinting(canSprint); //HandleSprinting()必須是運動類別的最后一個手柄。
}
bool[] DetectLedge()。
{
/*
* 真值表。
* 索引。
* 0 1 2
* 上限|下限|可攀登
* 0 | 0 | 0 /0
* 1 | 0 | 0 /1
* 0 | 1 | 1 /2
* 1 | 1 | 0 /3
*/
bool[] ledgeInfo = new bool[3] { false, false, false }; /0
ledgeInfo[0] = Physics.CheckBox(upperLedgeDetector.position, upperLedgeDetector.lossyScale, upperLedgeDetector.rotation, 128) 。
ledgeInfo[1] = Physics.CheckBox(lowerLedgeDetector.position, lowerLedgeDetector.lossyScale, lowerLedgeDetector.rotation, 128) 。
ledgeInfo[2] = ledgeInfo[1] && !ledgeInfo[0] ? true : false;
return ledgeInfo;
}
void HandleLedgeClimbing(bool isEnabled)
{
if(isEnabled)
{
Debug. Log(DetectLedge()[0] " " DetectLedge()[1] " " DetectLedge()[2] )。)
if(DetectLedge()[2] )
{
Debug.LogWarning("Ledge!")。
canMove = false; //<--------------------Here it is!
Vector3 calculatedPos = Vector3.zero;
RaycastHit hit。
Physics.Raycast(upperLedgeDetector.position, Vector3.down, out hit, 3f, 128)。)
calculatedPos = new Vector3(lowerLedgeDetector.position.x, upperLedgeDetector.position.y - hit.distance, lowerLedgeDetector.position.z) 。
if(transform.position != calculatedPos)
transform.position = Vector3.Lerp(transform.position, calculatedPos, Time.deltaTime)。
}
}
}
這就是我認為導致該問題的所有代碼。
好了,現在來解釋一下什么地方不作業。每當我運行這個場景時,我的播放器就會停止移動。
這完全是意料之外的,因為它應該停止移動的唯一原因是canMove變數是假的,但我從未將它設定為假的。
現在,代碼中唯一一個從真變假的地方是在HandleLedgeClimbing() void。但它不應該被設定為假的。
我把它標記為假的。
我用一個大箭頭標記了它的位置。 現在,我不是一個專家,但我非常肯定, 此外,是的,你沒有看錯,"只有" TL/DR:代碼的一部分被呼叫了,而在場景中呈現的條件下,它不可能被呼叫。最好的部分是:只有一個特定的行被呼叫。甚至不是整個塊。我想消除這種情況的發生。
條件。DetectLedge[2] 必須為真,才能運行 if 陳述句。除錯證明它總是假的(除非我們靠近壁架),而之前的測驗也加強了這一事實。
uj5u.com熱心網友回復: UHM
我修復了它......以最奇怪的方式?我完全不確定是什么導致了這個問題,但如果有人知道,請分享。有些人可能會發現它很有趣。
不管怎樣,這里是修復方法: 基本上,我沒有使用一個 在另一個函式中,我使用了一個結構。
而在另一個函式中,我沒有在 而且... 那就解決了。
標籤:if 陳述句中的所有內容只有在 if 陳述句中的條件為真時才會運行。那么為什么只有canMove = false;在 if 陳述句為假時才運行,這是由那個Debug.Log(DetectLedge()[0] " " DetectLedge()[1] " " DetectLedge()[2]);(當我運行場景時,三個變數都回傳假;注意:只有最后一個變數在 if 陳述句中被檢查)。
Debug.LogWarning("Ledge!");放在那里,想看看是什么原因導致if陳述句突然變成了真的。但它從未被呼叫過! 有點creepy,哈哈-EdgeDetectInformation DetectLedge(/span>)
{
/*
* 真值表。
* 索引。
* 0 1 2
* 上限|下限|可攀登
* 0 | 0 | 0 /0
* 1 | 0 | 0 /1
* 0 | 1 | 1 /2
* 1 | 1 | 0 /3
*/
bool[] ledgeInfo = new bool[3] { false, false, false }; /0
ledgeInfo[0] = Physics.CheckBox(upperLedgeDetector.position, upperLedgeDetector.lossyScale, upperLedgeDetector.rotation, 128) 。
ledgeInfo[1] = Physics.CheckBox(lowerLedgeDetector.position, lowerLedgeDetector.lossyScale, lowerLedgeDetector.rotation, 128) 。
ledgeInfo[2] = ledgeInfo[1] && !ledgeInfo[0] ? true : false;
return new EdgeDetectInformation(ledgeInfo[0), ledgeInfo[1], ledgeInfo[2])。)
}
bool[],而是使用了一個結構。這是 @derHugo 的想法,所以謝謝你!Debug.Log()中反復呼叫它,而是這樣做: void HandleLedgeClimbing(bool isEnabled)。
{
if(isEnabled)
{
EdgeDetectInformation EDI = DetectLedge();
Debug.Log(EDI.upper " "/span> EDI.lower " "/span> EDI.canClimb)。
if(EDI.canClimb)
...
