Unity打孔协程没有完成

时间:2018-04-19 02:00:10

标签: c# unity3d coroutine

所以我的代码如下。

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区域,但我不知道。我查看了其他代码示例,它应该正常工作。希望你们有一些答案。

2 个答案:

答案 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倾向于更喜欢这样。

希望这有帮助。