在Unity编辑器当中,我们可以手动修改文本框的内容,但是在游戏游玩过程当中,我们想通过触发特定事件动态改变文本内容,例如角色吃到金币之后会加分并显示到右上角,那该如何实现呢?
首先创建文本框
创建两个,分别在文本框输入分数:以及0(注:不一定是0,可以是其他内容)
然后拖拽到你觉得满意的地方,例如右上角
接下来,创建一个C#脚本,命名随意(这里我命名为GamePlayer)
然后,创建一个浮点型变量,命名为score。再重写一个方法,在Visual Studio中输入OnCollisionEnter自动跳出,这个方法是脚本挂载的物体被其他物体碰撞的时候执行的,然后判断碰撞的物体是不是金币,即
if (collision.gameObject.name == “GoldCoin”)
{
Destroy(collision.gameObject);
GameObject.Find(“DonnotDestory”).GetComponent<DonnotDestory>().score += 20;
source.Play();
}
具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GamePlayer : MonoBehaviour
{
public float score;//定义分数变量
private AudioSource source;//音效组件
void Start()
{
source = GetComponent<AudioSource>();//初始化音效组件
}
void Update()
{
}
private void OnCollisionEnter(Collision collision)//有物体碰撞时执行这个方法
{
if (collision.gameObject.name == "GoldCoin")//如果碰撞的物体名为"GoidCoin"
{
Destroy(collision.gameObject);//让被吃的金币在场景中消失
score += 20;//加20分
source.Play();//播放音效
}
}
}
然后,把这个脚本拖拽到主角身上(在Hierarchy视图)
再创建个脚本,我命名为ScoreText
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScoreText : MonoBehaviour
{
private Text m_Text;//定义文本组件
public GameObject player;
void Start()
{
m_Text = GetComponent<Text>();
player = GameObject.Find("ThirdPersonController_LITE");
//Find括号里面填的是主角在场景中的名字,这一步很关键
//以上两个代码很耗系统资源,所以尽量不要写在Update里面
}
void Update()
{
m_Text.text = player.GetComponent<GamePlayer>().score.ToString();
//让文本框显示的内容等同于主角目录下GamePlayer脚本当中的score变量的值,并且转化为String
}
}
然后挂载到显示数值的文本框中
这样,实现动态文本框的功能就完成了,不过依然跑不起来,因为刚刚我在第一个脚本中写了关于音效的代码,现在还没用上。
我们回到主角的属性中,添加一个组件,叫Audio Source
然后,把音频资源拖拽到这里(音频资源可以去爱给网找)
这样,就完成了,现在试试效果
以上,效果已经实现了
补充一点,如果像我这样,让文本框好看一些:在文本框层次之上再套个Image组件,然后再拖入你想要的图片即可,字体颜色可以在文本框组件里面改