所以我的代码如下。
void Update() {
// WASD Movement
if (Input.GetKey(KeyCode.W)) { movementUpdate.y += movementPerSecond * Time.deltaTime; }
if (Input.GetKey(KeyCode.A)) { movementUpdate.x -= movementPerSecond * Time.deltaTime; }
if (Input.GetKey(KeyCode.S)) { movementUpdate.y -= movementPerSecond * Time.deltaTime; }
if (Input.GetKey(KeyCode.D)) { movementUpdate.x += movementPerSecond * Time.deltaTime; }
playerBody.position = playerBody.position + movementUpdate;
movementUpdate = new Vector3(0, 0, 0);
// Body rotation relative to cursor position
Vector3 dir = Input.mousePosition - Camera.main.WorldToScreenPoint(transform.position);
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
playerBody.rotation = Quaternion.AngleAxis(angle - 90, Vector3.forward);
// hand position via function
UpdateHandPosition(playerLeftHand, desiredPositionForLeftHand);
UpdateHandPosition(playerRightHand, desiredPositionForRightHand);
if (Input.GetMouseButtonDown(0)) {
Punch();
}
}
...
void Punch() {
StartCoroutine(PunchCoroutine());
}
IEnumerator PunchCoroutine() {
Debug.Log("User punched.");
if (onLeftHandPunch = false) {
print(onLeftHandPunch);
onLeftHandPunch = false;
// punch the shit
desiredPositionForLeftHand = "middleMiddleCoordinates";
yield return new WaitForSeconds(1f);
Debug.Log("Corountine finished.");
desiredPositionForLeftHand = "topMiddleCoordinates";
} else {
print(onLeftHandPunch);
onLeftHandPunch = true;
// punch the shit
desiredPositionForRightHand = "middleMiddleCoordinates";
}
}
但是当我播放代码并单击鼠标左键时,控制台中会显示以下内容。
User punched.
False
Coroutine没有完成并显示
Coroutine finished.
有人可以帮助我吗?我认为问题出在yield WaitForSeconds区域,但我不知道。我查看了其他代码示例,它应该正常工作。希望你们有一些答案。
答案 0 :(得分:1)
另一个答案是正确的,因为问题是if (onLeftHandPunch = false)
行,但逻辑不正确的原因......
您的原始代码:
if (onLeftHandPunch = false) {
} else {
}
将始终运行else
部分,因为它将onLeftHandPunch
设置为false
,然后计算if语句。这会产生if (false)
,这意味着else
将会运行。
修复很简单,使用==
比较运算符代替=
赋值运算符:
if (onLeftHandPunch == false) {
} else {
}
您的协程正在完成,但您只在第一个“if”语句中打印“Coroutine finished”而不是“else”。如果你将它移到if
语句之外的底部,你会看到协程确实“完成”,但没有运行你想要的逻辑。
答案 1 :(得分:0)
在if语句if (onLeftHandPunch = false)
中,您实际上将变量设置为false。你应该使用' =='运营商。事实上,这总是正确的,因为它总是可以将变量设置为false。此外,您可能希望将WaitForSeconds(1f)更改为WaitForSeconds(1.0f),Unity倾向于更喜欢这样。
希望这有帮助。