일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 멀티플레이
- VR
- 개발일지
- 오브젝트 풀링
- 유니티 Json 데이터 연동
- OVR
- Oculus
- 팀프로젝트
- XR
- 개발
- 드래곤 플라이트 모작
- 모작
- 유니티
- 길건너 친구들
- 팀 프로젝트
- 가상현실
- 앱 배포
- meta xr
- CGV
- 오큘러스
- 유니티 GUI
- 드래곤 플라이트
- input system
- 연습
- Photon Fusion
- HAPTIC
- 포트폴리오
- meta
- ChatGPT
- 유니티 UI
Archives
- Today
- Total
EasyCastleUNITY
유니티 코루틴 본문
https://docs.unity3d.com/kr/2021.3/Manual/Coroutines.html
메서드가 아무리 길어도 1프레임안에서 실행된다.
따라서, 시간에 따라서 메서드를 적용하려면, 평범한 메서드로는 안된다.
그러므로, for문을 여러 frame에 걸쳐서 사용해야 된다.
즉, 렌더링을 값이 변하고 렌더링하고 다시 값이 변하면 렌더링 하는 방식을 해야된다.
Update에서도 가능하지만 코루틴이 더 편리하다.
왜 그러냐면 코루틴은 Update와 다르게 중지가 가능하기 때문이다.
그러므로 코루틴을 사용하는 것이다.
IEnumerator 반환타입하고, 어딘가에는 yield return 문을 작성하는 것이 코루틴의 사용법이다.
코루틴: IEnumerator 반환 타입과 바디 어딘가에 포함된 yield 반환문으로 선언된 함수
코루틴을 실행하려면 StartCoroutine 함수를 사용해야 한다.
이런식으로 코루틴을 사용하려면 StartCoroutine 메서드를 사용하여,
해당 코루틴 함수의 이름을 사용하면 된다. (하지만 옛날 방법)
코루틴 실습
위에서 그냥 for문을 돌렸던것과 다르게 의도했던 대로 애니메이션이 실행되는 것을 알 수 있다.
코루틴 예제 (Gameobject 이동)
코루틴이 아닌 방법으로 이동 구현
즉 바라보고 이동하고 렌더링한다. (Update가 끝나고 렌더링)
이런식으로 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Test
{
public class HeroController : MonoBehaviour
{
private Vector3 targetPosition;
private bool isMoveStart=false;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
//이동시작이라면
if (this.isMoveStart)
{
//방향을 바라봄
this.transform.LookAt(targetPosition);
//이미 바라봤으니깐 정면으로 이동 (relateTo: Self/지역좌표)
//방향 * 속도 * 시간
this.transform.Translate(Vector3.forward * 1f*Time.deltaTime);
//목표지점과 나 사이의 거리를 계산, 즉 1프레임 마다 거리를 계산
float distance = Vector3.Distance(this.transform.position, this.targetPosition);
if(distance <= 0.1f)
{
Debug.Log("<color=yellow>도착!</color>");
this.isMoveStart = false;
}
}
}
public void Move(Vector3 targetPosition)
{
//this.transform.position = targetPosition;
//이동할 목표 지점을 저장
this.targetPosition = targetPosition;
//이동시작
this.isMoveStart = true;
}
}
}
코루틴으로 이동 구현
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Test
{
public class HeroController : MonoBehaviour
{
private Vector3 targetPosition;
// Start is called before the first frame update
void Start()
{
}
public void Move(Vector3 targetPosition)
{
//this.transform.position = targetPosition;
//이동할 목표 지점을 저장
this.targetPosition = targetPosition;
StartCoroutine(this.CoMove());
}
private IEnumerator CoMove()
{
while (true)
//무한 반복이 되어 유니티가 멈출 수도 있음
//그러므로 yield return 필수
{
//방향을 바라봄
this.transform.LookAt(targetPosition);
//이미 바라봤으니깐 정면으로 이동 (relateTo: Self/지역좌표)
//방향 * 속도 * 시간
this.transform.Translate(Vector3.forward * 1f * Time.deltaTime);
//목표지점과 나 사이의 거리를 계산, 즉 1프레임 마다 거리를 계산
float distance = Vector3.Distance(this.transform.position, this.targetPosition);
if (distance <= 0.1f)
{
//도착
break;
}
yield return null; //다음 프레임 시작
}
Debug.Log("<color=yellow>도착!</color>");
}
}
}
즉 코루틴이 중복실행되어 생기는 문제이다.
그래서 이 문제를 해결한 코드이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Test
{
public class HeroController : MonoBehaviour
{
private Vector3 targetPosition;
private Coroutine moveRoutine;
// Start is called before the first frame update
void Start()
{
}
public void Move(Vector3 targetPosition)
{
//this.transform.position = targetPosition;
//이동할 목표 지점을 저장
this.targetPosition = targetPosition;
if(this.moveRoutine != null)
{
//이미 코루틴이 실행중이다 -> 중지
this.StopCoroutine(this.moveRoutine);
}
this.moveRoutine = StartCoroutine(this.CoMove());
}
private IEnumerator CoMove()
{
while (true)
//무한 반복이 되어 유니티가 멈출 수도 있음
//그러므로 yield return 필수
{
//방향을 바라봄
this.transform.LookAt(targetPosition);
//이미 바라봤으니깐 정면으로 이동 (relateTo: Self/지역좌표)
//방향 * 속도 * 시간
this.transform.Translate(Vector3.forward * 1f * Time.deltaTime);
//목표지점과 나 사이의 거리를 계산, 즉 1프레임 마다 거리를 계산
float distance = Vector3.Distance(this.transform.position, this.targetPosition);
if (distance <= 0.1f)
{
//도착
break;
}
yield return null; //다음 프레임 시작
}
Debug.Log("<color=yellow>도착!</color>");
}
}
}
'유니티 기초' 카테고리의 다른 글
간단 RPG 2 (0) | 2023.08.08 |
---|---|
간단 RPG (0) | 2023.08.08 |
바구니로 떨어지는 사과 받기 (여러가지 요소 추가) (0) | 2023.08.07 |
바구니로 떨어지는 사과 받기 (0) | 2023.08.07 |
주말과제: 이동하고 몬스터 공격 (1) | 2023.08.05 |