统一使用图像取消分数

时间:2017-03-16 08:07:27

标签: c# unity5

我们希望游戏中显示的分数是专门设计的数字字体。 我们从09获得了png格式的数字,我认为将它们放在Texture[]数组中并相应地显示它会很简洁。

以下是desplay控制器脚本

public class StepDespController : MonoBehaviour {

    public static StepDespController instance;
    private int step = 0;

    [SerializeField]
    public Texture[] numberTextures;

    private void Awake()
    {
        if(instance == null)
        {
            instance = this;
        }
    }

    public void addStep(int step)
    {
        this.step += step;
    }

    private void OnGUI()
    {
        char[] array = step.ToString().ToCharArray();
        Debug.Log(array);
        for (int i = 0; i < array.Length; i++)
        {
            GUI.DrawTexture(new Rect(0 + i * 30, 0, 20, 30), numberTextures[(int)char.GetNumericValue(array[i])]);
        }
    }
}

以下是来自09的数字纹理的绑定:

enter image description here

但我发现它不会在游戏场景中显示任何内容,我错过了什么?

感谢。

1 个答案:

答案 0 :(得分:1)

这是你的问题:

char[] array = step.ToString().ToCharArray();
Debug.Log(array);
for (int i = 0; i < array.Length; i++)
{
    GUI.DrawTexture(new Rect(0 + i * 30, 0, 20, 30), numberTextures[(int)char.GetNumericValue(array[i])]);
}

我建议您只使用它来代替这样做:

const int offset_step = 30; // declare standard step size
int offsetX = 0; // declare starting x offset
foreach(char c in step.ToString()) // iterate through all characters in your score value as string value
{
    // draw texture on index `char - (char)'0'`
    GUI.DrawTexture(new Rect(offsetX, 0, 20, 30), numberTextures[(int)(c - 0x30)]);
    offsetX += 30; // increase offset
}

稍微扩展这个答案。 char是字符的2字节宽数字表示(可打印或不可打印)。由于您只想显示数值,因此您必须记住,这些值从0开始,0x30最终为9,其中0x39为ASCII,且相同CP#51由C#使用。现在你需要做的就是,因为你的0纹理是数组中的“第0个”元素,就是从你的角色中减去ASCII数字字符的开头。

简单示例:

char zero = '0'; // 0x30
char one = '1'; // 0x31
// when you do `one == 1`
// it translates to  `0x31 == 0x01` which is false
// now consider this `one - zero == 1` 
// above will return true because 
// 0x31 - 0x30 == 0x01
// 0x01 == 0x01