按距离加分
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 语句,并且如果角色被击晕,则不要增加分数。所以,一切由你决定。
希望回答对您有所帮助,让您有个大概的了解。如果您对此有任何其他问题,请在评论中告诉我。
我目前正在学习 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 语句,并且如果角色被击晕,则不要增加分数。所以,一切由你决定。
希望回答对您有所帮助,让您有个大概的了解。如果您对此有任何其他问题,请在评论中告诉我。