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;
            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;
        }
    }
}

 注释比较详细 相信都能看明白。古德拜~

posted @ 2016-03-09 13:31  王赛  阅读(17354)  评论(0编辑  收藏  举报