有的游戲會有任務提醒功能。任務提醒在屏幕中心,然后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; } } }
注釋比較詳細 相信都能看明白。古德拜~