有的游戏会有任务提醒功能。任务提醒在屏幕中心,然后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 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;
}
}
}
注释比较详细 相信都能看明白。古德拜~