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