c# - 根据分数提高玩家速度(无尽的滑雪游戏)
问题描述
我正在制作一个无休止的滑雪游戏,类似于 alto 和滑雪 safari,并且需要帮助根据我的玩家所表演的技巧(后空翻等)的得分来提高他的速度。这是我到目前为止编写的代码:(此脚本根据后空翻计算玩家的得分)
public class tricksScore : MonoBehaviour
{
private float flips = 0;
private float deltaRotation = 0;
private float currentRotation = 0;
private float WindupRotation = 0;
public static Rigidbody2D rigbod;
float divideByNum = 0.25f;
public Text scores;
public int trickscore;
private int iflip;
// Start is called before the first frame update
void Start()
{
scores = GetComponent<Text>();
}
// Update is called once per frame
void Update()
{
deltaRotation = (currentRotation - rigbod.transform.eulerAngles.z);
currentRotation = rigbod.transform.eulerAngles.z;
if (deltaRotation >= 300)
deltaRotation -= 360;
if (deltaRotation <= -300)
deltaRotation += 360;
WindupRotation += (deltaRotation);
flips = WindupRotation / 340;
iflip = (int)flips;
iflip = iflip * -1;
trickscore = iflip * 10;
Debug.Log(trickscore);
scores.text = "score " + trickscore;
}
}
我将变量 trickscore 导入到负责角色移动的脚本中:
[SerializeField] private tricksScore trickscript;
public int trickscore;
public int oldScore = 0;
public int incInScore;
trickscore = trickscript.trickscore;
incInScore = trickscript.trickscore - oldScore;
if (incInScore >= 10)
{
oldScore = trickscript.trickscore;
}
if (incInScore > 1 && incInScore <= 10)
{
speed = speed + 10.15f;
}
else if (incInScore > 10 && incInScore <= 20)
{
speed = speed + 0.25f;
}
else if (incInScore > 20 && incInScore <= 50)
{
speed = speed + 0.50f;
}
else if (incInScore > 50 && incInScore <= 100)
{
speed = speed + 0.75f;
}
else if (incInScore > 100 && incInScore <= 200)
{
speed = speed + 1f;
}
else if (incInScore > 200)
{
speed = speed + 2f;
}
问题是当我执行后空翻时玩家的速度没有增加,而且我认为存储玩家分数(trickcore)的变量也已经损坏,因为在编写脚本之前,它曾经显示玩家得分控制台(debug.log)和文本对象(“分数”),但都不再发生。我是一个完整的代码新手,这是我制作的第一款游戏,这个问题已经让整个开发停滞了很多天,所以我将非常感谢任何和所有的帮助。谢谢
解决方案
我的猜测是,您将两个脚本都附加到了您的游戏对象,理想的情况是分开计算并让 1 个脚本处理它,习惯这一点,您将为自己节省很多错误(比传递脚本并拥有一个很多混淆),一个文件中的一个例子(如果你的播放器“currentSpeed”被使用,它也应该工作):
using UnityEngine;
using UnityEngine.UI;
public class tricksScore : MonoBehaviour
{
private float flips = 0;
private float deltaRotation = 0;
private float currentRotation = 0;
private float WindupRotation = 0;
public static Rigidbody2D rigbod;
float divideByNum = 0.25f;
public Text scores;
public int trickscore;
private int iflip;
public int oldScore = 0;
public int incInScore;
public float currentSpeed;
// Start is called before the first frame update
void Start()
{
scores = GetComponent<Text>();
}
// Update is called once per frame
void Update()
{
deltaRotation = (currentRotation - rigbod.transform.eulerAngles.z);
currentRotation = rigbod.transform.eulerAngles.z;
if (deltaRotation >= 300)
deltaRotation -= 360;
if (deltaRotation <= -300)
deltaRotation += 360;
WindupRotation += (deltaRotation);
flips = WindupRotation / 340;
iflip = (int)flips;
iflip = iflip * -1;
trickscore = iflip * 10;
currentSpeed += Calculations.CalculateSpeed(trickscore,oldScore);
}
}
//this should be in a separate file
public class Calculations
{
public static float CalculateSpeed(float currentScore, float oldScore)
{
var incInScore = currentScore - oldScore;
if (incInScore > 1 && incInScore <= 10)
{
return 10.15f;
}
else if (incInScore > 10 && incInScore <= 20)
{
return 0.25f;
}
else if (incInScore > 20 && incInScore <= 50)
{
return 0.50f;
}
else if (incInScore > 50 && incInScore <= 100)
{
return 0.75f;
}
else if (incInScore > 100 && incInScore <= 200)
{
return 1f;
}
else
{
return 2f;
}
}
}
推荐阅读
- php - PHPUnit 7.2 和 Codeception 2.4 不兼容
- java - Intellij IDEA 中的 GWT SuperDevMode 参数
- javascript - 如何在jquery中单击具有类的所有项目
- javascript - 键盘代码 229。不能与 preventDefault 一起使用
- r - R Dataframe 操作 - 用变量替换数字
- winapi - MapViewOfFileEx():将应用程序移植到 x64 是否需要我们为参数 lpBaseAddress 指定不同的地址(64 位)?
- html - Scale posts to screen size [div too big for screen]
- c# - Unity How to play two videos synchronously
- generics - 如何实现通用切片附加器?
- javascript - 如何根据 JavaScript 对象中的状态值过滤记录?