0评论

Unity3D动态设置UGUI中Text的大小和位置

清风 2019-02-25 202浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

现在大多数游戏都会有任务提醒功能,比如说任务提醒在屏幕中心,然后2-3秒后移动至右上角(根据功能自定)。下面就分享下动态设置Text的大小和位置的方法。

首先改变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;
        }
    }
}