코루틴 정의하기
❓If문 내부로 들어가서 BuildUISet()함수가 실행되었었는데,
Input이 들어왔을때만 작동 하는거라 매프레임 업데이트 되지않음.
💡Input값이 들어왔을때 BuildUI를 켜주고,
업데이트에서 BuildUI가 켜졌을때에 실행될수 있도록,
새로운 조건문을 만들어서, 매프레임 실행 되게 만들어줬음.
또한, 코루틴을 사용하여, BuildUISet()이 실행되고,
내부에서 실행이 완료된 후, Build() 함수를 호출해주는 방식을 이용함.
void Update()
{
if (previewStructure != null)
{
PreviewPositionUpdate();
}
if (previewStructure!=null && Input.GetButtonDown("Fire2"))
{
cancelInfoTxt.SetActive(false);
buildUI.SetActive(true);
}
if (buildUI.activeSelf == true)
{
StartCoroutine(BuildUISet());
}
}
private IEnumerator BuildUISet( )
{
buildUIImage.fillAmount = 0;
if (curDuration < needDuration)
{
curDuration += Time.deltaTime;
if (curDuration >= needDuration)
{
curDuration = needDuration;
}
}
buildUIImage.fillAmount = curDuration / needDuration;
yield return new WaitForSeconds(needDuration);
curDuration = default;
Build();
}
public void Build()
{
if (previewStructure && previewStructure.GetComponent<PreviewObject>().isBuildable()) //빌드가 가능 하다면
{
Instantiate(structurePrefab, hitInfo.point, Quaternion.identity);
Destroy(previewStructure);
ResetPreview();
}
buildUI.SetActive(false);
//빌드가 완료된 후, 건설중 BuildUI꺼주기
}
Cororutine 사용예제
코루틴 내부에서 시간만큼 제어해주기
private void start()
{
// 기다릴 시간
// 1초씩 기다린다.
// curTime += 1f
// curTime > 기다릴 시간
StartCoroutine(CorTest(10f));
StartCoroutine(CorTest());
}
void TestCall()
{
Debug.Log("Test");
}
IEnumerator CorTest(float waitTime = 5f)
{
float esplasedTime = 0f;
while (esplasedTime < waitTime)
{
// UI가 차오른다.
TestCall();
}
yield return new WaitForSeconds(1f);
esplasedTime += 1f;
}
Cororutine 사용예제
Invoke중일때, 다시 Invoke기능이 작동되지 않도록 제어해주고, 재실행 하는 방법
if (IsInvoking("TestCall"))
{
CancelInvoke("TestCall");
Invoke("TestCall", 5f);
}
RawImage Component 사용예제
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class Test : MonoBehaviour
{
[SerializeField] private RawImage rimg;
void Start()
{
StartCoroutine(CorWebRequest(@"https://www.paxetv.com/news/photo/202009/101401_73703_043.jpg"));
}
IEnumerator CorWebRequest(string url)
{
UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);
yield return www.SendWebRequest();
Debug.Log(www.result);
if (www.result == UnityWebRequest.Result.Success)
{
var tex = DownloadHandlerTexture.GetContent(www);
rimg.texture = tex;
}
}
}
readonly의 특징
👀 선언 및 초기화:
readonly 필드는 선언 시 초기화하거나, 생성자에서 초기화할 수 있습니다.
초기화 후에는 해당 필드의 값을 변경할 수 없습니다.
👀 실행 시간에 초기화 가능:
readonly는 런타임에 값을 설정할 수 있기 때문에, 생성자에서 동적으로 값을 설정할 수 있습니다. 이는 컴파일 시간에만 상수를 설정하는 const와 차이점입니다.
👀 인스턴스별로 다른 값 가능:
readonly 필드는 인스턴스 필드로 선언될 수 있기 때문에, 객체마다 다른 값으로 설정할 수 있습니다. 반면, const는 정적이며 클래스 전체에서 동일한 값을 가집니다.
👀 변경되지 않아야 하는 설정값(예: 기본 포트 번호)이나 고정된 참조값을 설정할 때 유용합니다.