0

我目前正在学习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();
    }
}

}

4

2 回答 2

0

你可以有这样的东西让你开始。我将其设置为 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.
    }
}
于 2020-05-10T22:04:24.677 回答
0

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

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

现在,您说要根据玩家在 + 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说它应该给您相同的结果。此外,我会在一个协程中实现这段代码,并有一点等待时间,以避免可能出现的错误。

现在,让我们考虑另一种情况。我不认为在无尽的奔跑游戏中角色不会无限,一般来说,角色对象是稳定的,你有点产生无尽流动的错觉。所以,假设你的角色的位置实际上并没有改变,但在游戏中,你的角色似乎在不停地奔跑。在这种情况下,您可能希望根据时间流逝增加分数。

private float score;

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

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

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

我希望这个答案对您有所帮助并给您一个总体思路。如果您还有其他与此相关的问题,请在评论中告诉我。

于 2020-05-10T22:09:45.873 回答