Unity3D-----动态设置UGUI中Text的⼤⼩和位置
有的游戏会有任务提醒功能。任务提醒在屏幕中⼼,然后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;
float upm_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 .ansform .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);
//物体的位置变化
//ansform.position = Vector3.ansform.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;
}
}
}
注释⽐较详细相信都能看明⽩。古德拜~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论