좋은 강의 잘 듣고 있습니다. 현재까지 Spider의 로직은 Behavior Graph로 구현하고, 일반 초록색 몬스터의 로직은 직접 스크립트로 구현하셨는데, 둘 다 어떻게 만드는지 과정을 보여주시려고 다른 방법으로 만드신건가요? 나중에 리팩토링 한다면 초록색 몬스터 로직도 Behavior Graph로 구현하는 것이 더 좋은걸까요?
여러번 죄송합니다. 학습에 크게 중요하지 않기 때문에 스킵하여 보고 있습니다. 갱신해 주신 Mia의 SpriteSheet를 보아도. 잠드는 모습 등의 Sprite는 없어 보입니다. 기존의 unitypackage도 있기 때문제 다시 한번 원본으로 주신 Sprite를 보아도 해당 애니메이션용 Sprite는 없어 보입니다. 아직 강의를 다 보지 못하여서 인지 하지 못하고 있을 지도 모르지만 나중에 Mia의 Sprite등이 수정이 있었을까요?
ResourceManager 클래스 관련 질문이 있습니다. ResourceManager 클래스를 만들어서 Load, Instantiate, Destroy 함수를 내장 함수를 래핑해서 만들었는데 래핑하는 이유를 잘 모르겠습니다. 그냥 내장 함수 바로 사용해도 되지 않나.. 라는 생각이 들었고 강의에서는 디버그 목적으로 래핑하는 것으로 이유를 이해했는데 뭔가 크게 와닿지 않아서 질문 드립니다.
강의 너무 이해가 잘돼요 감사합니다 캐릭터가 offMeshLink 앞에서 멈춥니다. 그 상태에서는 아무것도 안하고 그 자리에 가만히 있습니다. 앞에분이랑 비슷한 상황인데 점프도 안되고 아래로 떨어지는 거, 사다리타는거 다 안 돼요. 시작, 종료 지점 위치도 navigation 범위 안에 잘 있습니다 전에는 잘 됐는데 사다리 코드를 작성하니까 이렇게 됐어요 using System.Collections; using UnityEngine; using UnityEngine.AI; public class OffMeshLinkClimb : MonoBehaviour { [SerializeField] private int offMeshArea = 3; [SerializeField] private float climbSpeed = 1.5f; private NavMeshAgent navMeshAgent; private void Awake() { navMeshAgent = GetComponent<NavMeshAgent>(); } IEnumerator Start() { while ( true ) { // IsOnClimb() 함수의 반환 값이 true 일 때 yield return new WaitUntil(() => IsOnClimb()); // 올라가거나 내려가는 행동 yield return StartCoroutine(ClimbOrDescend()); } } public bool IsOnClimb() { // 현재 오브젝트의 위치가 OffMeshLink 에 있는지 if ( navMeshAgent.isOnOffMeshLink ) { // 현재 위치에 있는 OffMeshLink 의 데이터 OffMeshLinkData linkData = navMeshAgent.currentOffMeshLinkData; // 현재 OffMeshLinkData 가 true 면 수동 OffMeshLink, false 면 자동 OffMeshLink // 현재 위치에 있는 OffMeshLink 가 수동으로 생성한 것이고 장소 정보가 Climb 라면 if ( linkData.offMeshLink != null && linkData.offMeshLink.area == offMeshArea ) { return true; } } return false; } private IEnumerator ClimbOrDescend() { // 내비게이션 이동 일시 중지 navMeshAgent.isStopped = true; // 현재 위치에 있는 OffMeshLink 시작/종료 위치 OffMeshLinkData linkData = navMeshAgent.currentOffMeshLinkData; Vector3 start = linkData.startPos; Vector3 end = linkData.endPos; // 오르내리는 시간 설정 float climbTime = Mathf.Abs(end.y - start.y) / climbSpeed; float currentTime = 0.0f; float percent = 0.0f; while ( percent < 1 ) { // deltaTime 만 더하면 무조건 1초 뒤에 1퍼센트가 되기 때문에 climbTime 변수를 연산해서 시간을 조절 currentTime += Time.deltaTime; percent = currentTime / climbTime; // 시간 경과에 따라 오브젝트 위치 변경 transform.position = Vector3.Lerp(start, end, percent); yield return null; } // OffMeshLink 를 이용한 이동 완료 navMeshAgent.CompleteOffMeshLink(); // 내비게이션 이동 다시 시작 navMeshAgent.isStopped = false; } }
강의 너무 이해가 잘돼요 감사합니다 캐릭터가 offMeshLink 앞에서 멈춥니다. 그 상태에서는 아무것도 안하고 그 자리에 가만히 있습니다. 앞에분이랑 비슷한 상황인데 점프도 안되고 아래로 떨어지는 거, 사다리타는거 다 안 돼요. 시작, 종료 지점 위치도 navigation 범위 안에 잘 있습니다 전에는 잘 됐는데 사다리 코드를 작성하니까 이렇게 됐어요 using System.Collections; using UnityEngine; using UnityEngine.AI; public class OffMeshLinkClimb : MonoBehaviour { [SerializeField] private int offMeshArea = 3; [SerializeField] private float climbSpeed = 1.5f; private NavMeshAgent navMeshAgent; private void Awake() { navMeshAgent = GetComponent<NavMeshAgent>(); } IEnumerator Start() { while ( true ) { // IsOnClimb() 함수의 반환 값이 true 일 때 yield return new WaitUntil(() => IsOnClimb()); // 올라가거나 내려가는 행동 yield return StartCoroutine(ClimbOrDescend()); } } public bool IsOnClimb() { // 현재 오브젝트의 위치가 OffMeshLink 에 있는지 if ( navMeshAgent.isOnOffMeshLink ) { // 현재 위치에 있는 OffMeshLink 의 데이터 OffMeshLinkData linkData = navMeshAgent.currentOffMeshLinkData; // 현재 OffMeshLinkData 가 true 면 수동 OffMeshLink, false 면 자동 OffMeshLink // 현재 위치에 있는 OffMeshLink 가 수동으로 생성한 것이고 장소 정보가 Climb 라면 if ( linkData.offMeshLink != null && linkData.offMeshLink.area == offMeshArea ) { return true; } } return false; } private IEnumerator ClimbOrDescend() { // 내비게이션 이동 일시 중지 navMeshAgent.isStopped = true; // 현재 위치에 있는 OffMeshLink 시작/종료 위치 OffMeshLinkData linkData = navMeshAgent.currentOffMeshLinkData; Vector3 start = linkData.startPos; Vector3 end = linkData.endPos; // 오르내리는 시간 설정 float climbTime = Mathf.Abs(end.y - start.y) / climbSpeed; float currentTime = 0.0f; float percent = 0.0f; while ( percent < 1 ) { // deltaTime 만 더하면 무조건 1초 뒤에 1퍼센트가 되기 때문에 climbTime 변수를 연산해서 시간을 조절 currentTime += Time.deltaTime; percent = currentTime / climbTime; // 시간 경과에 따라 오브젝트 위치 변경 transform.position = Vector3.Lerp(start, end, percent); yield return null; } // OffMeshLink 를 이용한 이동 완료 navMeshAgent.CompleteOffMeshLink(); // 내비게이션 이동 다시 시작 navMeshAgent.isStopped = false; } }
안녕하세요 항상 좋은강의 제공해주셔서 감사합니다. C++ 서버강의를 수강하고 C#을 복습해보고 있는와중에. C++에서는 LockGuard처럼 소멸자 기반으로해서 RAII를 사용하는걸로 압니다. 하지만 C#에는 GC가있어서 메모리 해제시점을 모르니, 찾아보니 IDisposable을 상속받아서 구현할 수 있더라구요. 여기서 질문이 C#에서도 이런 RAII를 직접만들어서 관리를 자주할까요?? 그냥 lock (obj) 를 많이 쓸 것 같은데 혹시라도 직접 구현한 Lock같은경우는 어떤지 궁금합니다!
안녕하세요. 현재 유니티로 할 수 있는 모든 것을 하고싶은 수강생1입니다. 제가 지향하고있는 게임이 있다면 붉은사막인데요. 이유가 로딩지연없는심리스에 나름지성이있는 NPC에 여러가지 방대한 컨텐츠들이 있어서 인데요. 재미난 기능요소만 있다면 일단 만들고 넣고보는게 감명을 받았습니다. 지금 현재기준으로 만들고싶은게 있다면 vr 컨텐츠 방탈출 및 전투컨셉을 만들고싶고 차후에는 스마트글래스 컨텐츠들을 만들고싶습니다. 예를들어 손제스처로 몬스터볼을 던져서 포획하는 포켓몬go라던지 마블 아이언맨 1인칭 시점 HUD 이런느낌으로 컨텐츠들을 제작을 하고싶습니다. 본론으로 넘어가서 클로드 + 유니티 + 블렌더 등등의 툴들을 이용하여 제가 구상하고있는것들을 만들수있는지 그리고 현재강의를 듣고 근접하거나 응용할수있는지 방향성을 여쭙고싶습니다!
void Start() { Init(); } 이것을 실행 시키려면 결국 매니저라는 스크립트가 하이라이키에 있는 오브젝트가 있어야 스타트가 동작하는데 후반에 가면 매니저 스크립트가 게임오브젝트에 없는대도 잘 실행됩니다. 플레이어컨트롤러에서 불러오게 되는건가 어떻게 게임오브젝트에 매니저가 없는데 Init():를 실행시키게 되는지 궁금합니다. 어디서 Init():를 호출했는지 보는 방법이 있을지요. 브레이크 걸고 에프11 누르면 다음으로 이동하는데 다음 말고 이전으로 가는 방법도 있는지 궁금합니다.
public void SaveUserData() { bool hasSaveError = false; for (int i = 0; i < UserDataList.Count; i++) { bool isSaveSuccess = UserDataList[i].SaveData(); if(!isSaveSuccess) { hasSaveError = true; } } if(!hasSaveError) { ExistsSavedData = true; PlayerPrefs.SetInt("ExistsSavedData", 1); PlayerPrefs.Save(); } } 여기로직에서 hasSaveError가 실패로 발생하면 개발자 입장에서는 어떻게 버그를 알 수 있을까요? 그리고 개발자는 어떻게 대처를 해야 될까요??