본문 바로가기
유니티/유니티 기능 구현

유니티 캠퍼스바, 실시간 시간 구현

by xortl98 2022. 4. 20.
728x90

 개요

배틀그라운드처럼 위에 캠퍼스바와 실시간 시간을 입력받는 것을 구현해보았다. 

 

 출처 

캠퍼스바 참고 

https://www.youtube.com/watch?v=aMEHOU6xpWA 

 스크립트 

 

캠퍼스바 구현 

더보기

유튜브에 나오는 캠퍼스바 이미지 파일로 하면 에러가 나서 따로 캠퍼스바 이미지를 다운받아 사용했다. 

using UnityEngine.UI;
using UnityEngine;
public class Compass : MonoBehaviour
{
	public RawImage CompassImage;
	public Transform Player;
	public Text CompassDirectionText;

	public void Update()
	{
		//Get a handle on the Image's uvRect
		CompassImage.uvRect = new Rect(Player.localEulerAngles.y / 360, 0, 1, 1);

		// Get a copy of your forward vector
		Vector3 forward = Player.transform.forward;

		// Zero out the y component of your forward vector to only get the direction in the X,Z plane
		forward.y = 0;

		//Clamp our angles to only 5 degree increments
		float headingAngle = Quaternion.LookRotation(forward).eulerAngles.y;
		headingAngle = 5 * (Mathf.RoundToInt(headingAngle / 5.0f));

		//Convert float to int for switch
		int displayangle;
		displayangle = Mathf.RoundToInt(headingAngle);

		//Set the text of Compass Degree Text to the clamped value, but change it to the letter if it is a True direction
		switch (displayangle)
		{
		case 0:
			//Do this
			CompassDirectionText.text = "N";
			break;
		case 360:
			//Do this
			CompassDirectionText.text = "N";
			break;
		case 45:
			//Do this
			CompassDirectionText.text = "NE";
			break;
		case 90:
			//Do this
			CompassDirectionText.text = "E";
			break;
		case 130:
			//Do this
			CompassDirectionText.text = "SE";
			break;
		case 180:
			//Do this
			CompassDirectionText.text = "S";
			break;
		case 225:
			//Do this
			CompassDirectionText.text = "SW";
			break;
		case 270:
			//Do this
			CompassDirectionText.text = "W";
			break;
		default:
			CompassDirectionText.text = headingAngle.ToString ();
			break;
		}
	}
}

실시간 시간은 최적화를 위해 코루틴으로 구현해주었다. 

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UnityEngine.UI;

public class Timer : MonoBehaviour
{

    public Text DayTxt;
    public Text TimeTxT;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine("GetCurrentDate");
    }

    public void GetCurrentDate()
    {
        while(true)
        {
            string MonthAndDay = DateTime.Now.ToString(("MM/dd"));
            DayTxt.text = MonthAndDay;

            string DayTime = DateTime.Now.ToString("t");
            TimeTxT.text = DayTime;
        }       
    }

    // Update 안쓰고 일부러 코루틴써서 최적화 ---> 이제 여기서 시간에 맞게 ex) 만일 50초에 실행됐으면 10초 후 시간 바뀌고 다시 60초 타이머 
    IEnumerator GetCurrentDate()
    {
        bool first = true;
        int seconds = 60-DateTime.Now.Second;  
        while (true)
        {
            string MonthAndDay = DateTime.Now.ToString(("MM/dd"));
            DayTxt.text = MonthAndDay;

            string DayTime = DateTime.Now.ToString("t");
            TimeTxT.text = DayTime;
            if (first)
            {
                yield return new WaitForSeconds(seconds);
                first = false;
            }
            else yield return new WaitForSeconds(60f);
        }
    }
        
}

 플레이 영상