【问题标题】:Problem with calling a function only one time in unity统一调用一次函数的问题
【发布时间】:2022-10-07 05:16:39
【问题描述】:

我对编程还很陌生,我的统一游戏的这段代码有问题,基本上发生的事情是第一次我尝试调用 SelectGravity() 它执行 2 或 3 次,之后它似乎正常工作,我不知道为什么。

IsRotating = false 在另一个脚本中被调用,我正在使用 Visual Studio 2019 进行编码,如果这有帮助的话。

void Update()
    {
        Rotation = Input.GetAxisRaw(\"RotatoWorld\");

        if (Rotation != 0 && !IsRotating)
        {
            IsRotating = true;

            SelectGravity();
        }

        Physics2D.gravity = new Vector2(XGravity, YGravity);
    }

对于那些问这是我设置IsRotating false 的脚本

public IEnumerator Rotate90()
    {
        if(changeGravity.Rotation > 0.1)
        {
            Direction = 90;
        }
        else if(changeGravity.Rotation < -0.1)
        {
            Direction = -90;
        }

        float timeElapsed = 0;
        Quaternion startRotation = transform.rotation;
        Quaternion targetRotation = transform.rotation * Quaternion.Euler(0, 0, Direction);

        while (timeElapsed < lerpDuration)
        {
            transform.rotation = Quaternion.Slerp(startRotation, targetRotation, timeElapsed / lerpDuration);
            timeElapsed += Time.deltaTime;
            yield return null;
        }

        transform.rotation = targetRotation;

        StartCoroutine(CameraShake());

        changeGravity.IsRotating = false;
    } 

我已经这样声明了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeGravity : MonoBehaviour
{
    CameraRotation cameraRotation;
    PlayerController playerController;

    private float XGravity;
    private float YGravity;
    public float Side;

    public float Rotation;
    public bool IsRotating;

    // Start is called before the first frame update
    void Start()
    {
        cameraRotation = GameObject.FindGameObjectWithTag(\"MainCamera\").GetComponent<CameraRotation>();
        playerController = GameObject.FindGameObjectWithTag(\"Player\").GetComponent<PlayerController>();

        Side = 0;

        YGravity = -9.81f;
        XGravity = 0f;

        IsRotating = false;
    }

除此之外,我不会在任何地方调用此函数或修改此变量。

  • 您如何断言 SelectGravity 基于一次更新被调用 2 或 3 次?
  • 对于每次调用Update,该代码不能多次调用SelectGravity。如果SelectGravity 被多次调用,那么您要么是从其他地方调用它,要么是多次调用Update。我们无法帮助您解决这两种情况,因为我们还没有看到相关代码。
  • @Mathias 我是说 SelectGravity 被多次调用,因为我尝试在函数中放置一个 Debug.Log 并在控制台中打印 2 或 3 次(通常为 3,但有时为 2)。 @John 我确定 SelectGravity 不会在其他任何地方调用,Update 会在每一帧中调用
  • 很难像这样说..你能包括整个脚本而不仅仅是sn-ps吗?

标签: c# unity3d


【解决方案1】:

检查IsRotating 布尔值。它应该在其他地方修改或 bool decleration 函数不正确。

【讨论】:

  • 布尔值IsRotating 被声明为全局变量并在void start() 中设置为假,除此之外并在一段时间后将其设置为真(如之前在另一个脚本中所说,但工作正常)不会在其他任何地方修改
  • 让我们看看使用IsRotation 的其他脚本吗?
  • 我已经修改了原始问题并添加了已修改变量的任何其他脚本
  • 首先,我对此不是 100% 确定,但我想问题是Rotate90 IEnumerator。您可能会在某处调用 IEnumerator 几次,并且相同的变量会翻转并跳转到 IsRotating = false; 代码和更新方法调用 IsRotating = true;SelectGravity(); 您可以再添加一个布尔值来检查 IEnumerator 但我不推荐。
【解决方案2】:

我发现问题在于脚本附加到多个对象,因此void update() 每帧被调用两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2017-06-14
    • 2021-09-03
    相关资源
    最近更新 更多