完成上一个更新后的激活功能,Unity C#

时间:2018-05-24 06:03:20

标签: c# unity3d

这不是完整的脚本。我只是展示了我遇到问题的部分。

问题面对:

我想制作整洁干净的脚本,因此我只将函数调用到我的更新中。

我想在第一行更新中引入( StartGameFreezeMovement )函数。

我无法做到。像其他函数一样,因为这个函数中有一个计时器。

结果通缉:

我的目的是为更新中的第一个功能找到一种完全完成然后加载或激活其余功能的方法。

我怎样才能做到这一点?

public class PlayerController : MonoBehaviour {

private CharacterController controller;
public float speed;
private Vector3 moveVector;
private float verticalVelocity;
public float gravity;
private float animationDuration = 3.0f;
public Text text;
private float timer;
//-------------------------------------------------------------------------
void Start ()
{
    text.text = "";
    controller = GetComponent<CharacterController>();
}
//-------------------------------------------------------------------------
// Update is called once per frame
void Update ()
{
    if(Time.time < animationDuration)
    {
        PlayerMovingForward();
        return; //getout of if...
    }
    StartText();
    PlayerMovingForward();
    PlayerLeftnRight();
    PlayerFalloffGravity();
}
//----------------------------------
void StartGameFreezeMovement()
{
    if (Time.time < animationDuration)
    {
        PlayerMovingForward();
        return; //getout of if...
    }
}

2 个答案:

答案 0 :(得分:0)

您可以将StartGameFreezeMovement更改为bool。

bool StartGameFreezeMovement()
{
    if (Time.time < animationDuration)
    {
        PlayerMovingForward();
        return true; //getout of if...
    }
    return false;
}

然后更改您的更新功能。然后为了保持干净,如果你没有通过布尔检查以提前退出更新功能,请使用return。

void Update ()
{
    if (!StartGameFreezeMovement())
    {
        return;
    }

    StartText();
    PlayerMovingForward();
    PlayerLeftnRight();
    PlayerFalloffGravity();
}

答案 1 :(得分:0)

  

我的目的是为更新的第一个功能找到一种方法   完全完成然后加载或激活其余部分。

您需要Coroutine功能。 #replace strings nan to np.nan first df[['Code', 'Sales']] = df[['Code', 'Sales']].replace('nan',np.nan) mask = (df['Code'].ffill() == 'Big') | (df['Code'] == 'Small') df.loc[mask, 'Sales'] = df['Sales'].ffill() df['Dollars'] = df.apply(lambda row: row.get(row['Sales']+'_$') if pd.notnull(row['Sales']) else np.nan, axis=1) df['Cents'] = df.apply(lambda row: row.get(row['Sales']+'_c') if pd.notnull(row['Sales']) else np.nan, axis=1) print (df) Code Julie_$ Julie_c Sales Tom_$ Tom_c Dollars Cents 0 NaN 500 300 NaN 500 100 NaN NaN 1 NaN 40 20 NaN 50 20 NaN NaN 2 Big 10 70 Tom 10 40 10.0 40.0 3 NaN 10 50 Tom 60 50 60.0 50.0 4 NaN 50 80 Tom 50 0 50.0 0.0 5 Small 37 67 Tom 77 67 77.0 67.0 6 NaN 30 50 NaN 30 90 NaN NaN 7 Big 900 100 Julie 600 100 900.0 100.0 8 NaN 40 40 Julie 40 0 40.0 40.0 9 NaN 50 0 Julie 60 0 50.0 0.0 函数是Update函数。你必须创建一个协同程序函数并启动它,然后确保它不会退出,这样它就会模仿每帧调用的void函数。这可以通过添加while循环并产生每一帧来完成。

最后,将Update函数从StartGameFreezeMovement转换为协程函数,然后将void更改为if (Time.time < animationDuration)并使用while (Time.time < animationDuration)在其中生成,以便在等待yield return null;函数完成时,其他脚本将有机会执行。

以下是您问题代码的固定版本:

StartGameFreezeMovement

如果您需要在private void Start() { //Start once StartCoroutine(YieldableUpdate()); } IEnumerator YieldableUpdate() { //Call and wait for the StartGameFreezeMovement function to finish yield return StartGameFreezeMovement(); //Run forever while (true) { StartText(); PlayerMovingForward(); PlayerLeftnRight(); PlayerFalloffGravity(); //Wait a frame so that Unity doesn't freeze yield return null; } } IEnumerator StartGameFreezeMovement() { while (Time.time < animationDuration) { PlayerMovingForward(); //Wait a frame so that Unity doesn't freeze yield return null; } } 循环中多次检查StartGameFreezeMovement()移动yield return StartGameFreezeMovement();,否则此检查只会发生一次。