按距离加分

add score by distance

我目前正在学习 unity3d 并开始创建一个无尽的游戏,我想根据玩家在 + x 轴上移动的距离添加分数,所以我只想计算玩家在 + x 轴上移动了多远..如何计算?

这是我的脚本

public class Score : MonoBehaviour
public float distance;
public Transform player;
private float score = 0f;
public Text scoreText;

void Awake()
{
    distance = Vector3.Distance(player.position, transform.position);
}


void Update()
{
    if (distance > player.transform.position.x)
    {
        score = distance ++;
        scoreText.text = distance.ToString();
    }
}

}

您可以从类似的东西开始。我将它设置为 0.1 距离以获得 +1 分数,但该数字当然可以是任何值。

private const float DISTANCE_REQUIRED_FOR_1_POINT = 0.1f;
private Vector3 previousPlayerPosition;
private float distanceSinceLastScore;

public Transform player;
private float score = 0f;
public Text scoreText;

void Awake()
{
    //At the start save the start position.
    previousPlayerPosition = player.position;
}


void Update()
{
    //Calculate the distance travvelled since last update.
    distanceSinceLastScore += player.position.x - previousPlayerPosition.x;
    //Set the previous position the current.
    previousPlayerPosition = player.position;

    int scoreToAdd = 0;
    while (distanceSinceLastScore > DISTANCE_REQUIRED_FOR_1_POINT)
    {
        //Calculate how many points to add in this update. (Likely always 1 or none)
        ++scoreToAdd;
        distanceSinceLastScore -= DISTANCE_REQUIRED_FOR_1_POINT;
    }

    if (scoreToAdd > 0)
    {
        score += scoreToAdd;//Add to the total score.           
        scoreText.text = score.ToString();//refresh the text display.
    }
}

老实说,您提供的游戏信息很少。但我会尝试提出一些可能的场景和解决方案。

首先,你说这是一个无尽的游戏,那么我不知道你计算的玩家和一个点之间的距离是多少。所以,你的代码对我来说没有多大意义,如果我遗漏了什么请解释。

现在,你说你想根据玩家在 + x 轴上移动的距离来计算分数。所以,看看这段代码:

float previousPlayerX;
public Transform player;
private float score;

void Awake()
{
    previousPlayerX= player.position.x;
    score = 0;
}

void Update()
{
    if (previousPlayerX < player.position.x)
    {
        score += player.position.x - previousPlayerX;
        previousPlayerX = player.transform.position.x
    }
}

只要玩家是 运行 +x,此代码就会增加分数。如果玩家停止甚至回头,则不会更新分数。另外,请注意,如果您的起始位置是 0,那么您不需要减去两个位置来添加分数,您可以简单地继续并说 score = player.position.x,它应该会给您相同的结果。此外,我会在协程中实现此代码并等待一些时间以避免可能出现的错误。

现在,让我们考虑另一种情况。我不认为角色不会在无尽的 运行 游戏中走向无穷大,通常,角色对象是稳定的,你有点制造无尽流动的错觉。所以,假设你的角色的位置实际上并没有改变,但在游戏中,你的角色似乎在不停地 运行ning。在这种情况下,您可能希望根据时间的推移增加分数。

private float score;

void Awake()
{
    score = 0;
    StartCoroutine(UpdateScore());
}

IEnumerator UpdateScore()
{
    while(true)
    {
       score += 1;
       yield return new WaitForSeconds(1);
    }
}

正如您在第二个代码中看到的那样,我只是假设我的角色 运行 不停地并且我只是每秒将分数增加 1。你可以每半秒做一次,你可以通过乘以速度值来增加分数,或者你可以放置一个 if 语句,并且如果角色被击晕,则不要增加分数。所以,一切由你决定。

希望回答对您有所帮助,让您有个大概的了解。如果您对此有任何其他问题,请在评论中告诉我。