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

 注釋比較詳細 相信都能看明白。古德拜~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM