首页 > 解决方案 > 根据分数提高玩家速度(无尽的滑雪游戏)

问题描述

我正在制作一个无休止的滑雪游戏,类似于 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)和文本对象(“分数”),但都不再发生。我是一个完整的代码新手,这是我制作的第一款游戏,这个问题已经让整个开发停滞了很多天,所以我将非常感谢任何和所有的帮助。谢谢

标签: c#unity3d

解决方案


我的猜测是,您将两个脚本都附加到了您的游戏对象,理想的情况是分开计算并让 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;
        }
    }
}

推荐阅读