首页 > 解决方案 > 我如何判断一个数字何时完成增加?

问题描述

我觉得我在这里错过了一些简单的解决方案,但我坚持这一点。我正在根据玩家在课程结束时撞到建筑物之前的移动距离来计算分数。破坏分数与距离分数是分开的,它会递增,直到所有的建筑部件都静止。

我有一个我想播放的动画,将距离得分添加到总破坏得分并给出玩家的总得分,但是一旦破坏得分停止增加,我需要触发动画。现在,建筑物的每一块都有代码来检查它是否移动并在真实时增加分数。

public class SkiLodgeScoreTracker : MonoBehaviour
{
    Rigidbody rb;
    private GameObject[] score;
    private void Start()
    {
        rb = gameObject.GetComponent<Rigidbody>();
        score = GameObject.FindGameObjectsWithTag("Score"); 
    }
    private void Update()
    {
        //check if lodgePiece is moving, while it is, add to Score object
        if(rb.velocity.magnitude >= 2f && !rb.isKinematic)
        {
            score[0].GetComponent<SkiScore>().addToSkiScore(2f);
        }

    }
}

这是我想要在分数停止后触发动画的地方(这是我的另一次尝试,逻辑不起作用)


    public Animator moveScore;
    ...
    if(skiScore > 0)
        {
            previousScore2 = previousScore1;
            previousScore1 = skiScore;
            if(previousScore1 == previousScore2 && !scoreMoved)
            {
                moveScore.SetTrigger("EndCourse");
                addScoreToSkiScore();
            }
            
        }
     public void addScoreToSkiScore()
        {
            scoreMoved = true;
            for(float i = score; i>0; i--)
            {
                skiScore += 1; 
            }
        }

我想抓取一帧的分数,看看它是否等于下一帧的分数,如果是,则触发动画,但我觉得这不是一个有效的选项。

有任何想法吗?

标签: c#unity3d

解决方案


SkiScore中,跟踪有多少块在移动,当一块停止并且计数变为 0 时,执行您的操作:

public class SkiScore : MonoBehaviour 
{
    int movingCount;
    void Start()
    {
        ResetMovingCount();
        /* ... */
    }
    public void ResetMovingCount() {movingCount = 0;} // call as needed
    public void OnStartedMoving() {++movingCount;}
    public void OnStoppedMoving() 
    {
        if (--movingCount == 0) OnNoneMoving();
    }
  
    void OnNoneMoving() {/* do the thing */}

    /* ... */
}

对于每首乐曲,使用一个标志来记住它最近是否移动过,如果已经移动过并且不再移动,请让您的乐谱经理知道:

public class SkiLodgeScoreTracker : MonoBehaviour
{
    Rigidbody rb;
    private GameObject[] score;

    // flag used to recognize newly stopped movement
    bool recentlyMoving;

    // cache for GetComponent
    SkiScore mySkiScore

    private void Start()
    {
        rb = gameObject.GetComponent<Rigidbody>();
        score = GameObject.FindGameObjectsWithTag("Score"); 

        // GetComponent is expensive, try not to call it in Update unless necessary
        mySkiScore = score[0].GetComponent<SkiScore>();
    }
    private void Update()
    {
        //check if lodgePiece is moving, while it is, add to Score object
        if(rb.velocity.magnitude >= 2f && !rb.isKinematic)
        {
            mySkiScore.addToSkiScore(2f);
            recentlyMoving = true;
            mySkiScore.OnStartedMoving();
        }
        else if (recentlyMoving)
        {
            recentlyMoving = false;
            mySkiScore.OnStoppedMoving();
        }
    }
}

推荐阅读