有的游戏会有任务提醒功能。任务提醒在屏幕中心,然后2-3秒后移动至右上角(根据功能自定)。
首先改变Text的位置可以通过设置transform. position来改变,其次改变Text的大小可以通过改变Text的localScale或者height/width来改变。
我要实现的功能是:在接到任务时显示在中间的文本框,待2-3秒后开始变小并移动位置。
待中间的文本框移动到终点位置时,中间的文本框的文本赋给终点位置文本框的文字,中间文本框文本设为空。
我改变Text的大小是通过localScale来改变的。
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections .Generic; public class TaskTipTest : MonoBehaviour { public Text textMiddle; public Text textRightUp; public int i = 1; private bool isArrived = true; public string m_str = "移动结束" ; private float m_timer = 0; // 计时器 private float m_CuteTimer = 0; private int m_moveState = 0; // 移动到第几阶段 private float m_scale = 0; // 物体的初始大小 private float m_scaleIndex = 0 ; // 大小 private Vector3 m_startPos; // 保存文本的初始位置 private float m_Speed = 0; // 变慢以后的速度 private Dictionary <int, string> m_cuteList; private void Awake() { CuteWangList(); } private void CuteWangList() { m_cuteList = new Dictionary< int, string >(); m_cuteList .Add(1 , "任务1:恩恩"); m_cuteList .Add(2 , "任务2:呵呵"); m_cuteList .Add(3 , "任务3:呼呼"); m_cuteList .Add(4 , "任务4:大大"); m_cuteList .Add(5 , "任务5:呃呃"); m_cuteList .Add(6 , "任务6:哈哈"); } void Update() { if (Input .GetKeyDown(KeyCode .A)) { textMiddle .text = m_cuteList[i]; isArrived = false ; } if (! isArrived) { m_CuteTimer += Time .deltaTime; if (m_CuteTimer >= 2f) { MoveLines(i); } else { textMiddle .text = m_cuteList[i]; } } } private void MoveLines(int id) { MoveLines(textMiddle .transform. position, textRightUp .transform. position, 1f, 0.5f, 600f , i); } //匀速移动的效果 private void MoveLines(Vector3 startPos, Vector3 endPos, float startScaleX, float endScaleX, float moveSpeed, int id) { //当处于初始阶段的时候 if (m_moveState == 0) { m_timer += Time .deltaTime; m_startPos = startPos; m_Speed = moveSpeed; m_scale = startScaleX; //将物体的初始位置设置到起点的位置 textMiddle .transform. position = startPos; //设置物体初始阶段的大小 textMiddle .transform. localScale = new Vector3 (m_scale, m_scale, 1); //计算物体大小的偏移 m_scaleIndex = (startScaleX - endScaleX) / 100f ; //初始阶段结束,将阶段改为第一阶段 m_moveState = 1 ; } //处于第一阶段的时候 else if (m_moveState == 1 ) { m_timer += Time .deltaTime; //计算物体要移动的方向 Vector3 target = endPos - startPos; //物体开始移动 if (Vector3 .Distance(textMiddle.transform .position, endPos) <= 5.5f) { textMiddle .transform. position = endPos; textMiddle .transform. localScale = new Vector3 (endScaleX, endScaleX, 1); //进入到第二阶段 m_moveState = 2 ; } textMiddle .transform. Translate(target .normalized * Time. deltaTime * m_Speed, Space.World); //物体的位置变化 //textMiddle.transform.position = Vector3.SmoothDamp(textMiddle.transform.position, endPos, ref speed, playTime, m_Speed, Time.deltaTime); //物体的大小跟透明度的变化 //大小 if (m_scale >= endScaleX) { m_scale -= m_scaleIndex; textMiddle .transform. localScale = new Vector3 (m_scale, m_scale, 1); } else { m_scale = endScaleX; } } else if (m_moveState == 2 ) { textMiddle .text = ""; textMiddle .transform. position = m_startPos; textRightUp .text = m_cuteList[i]; //进入到第三阶段 m_moveState = 3 ; } else if (m_moveState == 3 ) { Debug.Log( "返回" ); m_timer = 0 ; m_CuteTimer = 0 ; isArrived = true ; m_moveState = 0 ; return; } } }
注释比较详细 相信都能看明白。古德拜~