묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
스테이지 반복이 진행될 수록 몬스터 스케일이 작아집니다.
현재 스테이트패턴 Dead 까지 수강한 상태이구요,스테이지의 반복이 진행될수록, 몬스터 스케일이 불규칙적으로 작아집니다.처음에는, 몬스터 스케일이 불규칙적으로 작아지는것에 있어서 몬스터가 스폰되는 중에 캐릭터가 100%까지 처치를 완료하여, SpawnStart 코루틴메서드를 통해 LocalScale이 커지고 있는 도중, Return 메서드가 호출되어 비활성화가 된듯한 느낌을 받아(게임오브젝트가 비활성화가 되면 코루틴메서드가 중단되지않나요?) 확인해보았으나, 정확하게 원인을 파악하지 못했습니다 ㅠ 그리고 몬스터가 스폰되지 않았음에도 허공에 어택모션을 계속 취하는 버그도 있습니다.분명 풀링에는 전부 비활성화인데, 타겟이 있는것처럼 허공에 공격모션을 계속 취하다가, 몬스터가 실제로 스폰되면 추적하여 공격을 실행합니다. 제가 혹시 코드에 잘못된부분이 있다면 리뷰 한번만 부탁드립니다. ㅠ 추가적으로 필요하신 코드나, 직접적인 버그영상이 필요하시면 댓글한번만 남겨주시면 동영상을 개인메일이나, 유튜브 링크로 첨부해서 보여드리겠습니다. using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spawner : MonoBehaviour { public int M_Count; // 몬스터의 수 public float M_SpawnTime; // 몇 초마다 스폰이 될 것인지 결정. // 1. 몬스터는 여러마리가 몇 초 마다 수시로 여러번 스폰 되어야 한다. //Spawner 에 손쉽게 접근하기 위해, static으로 설계 public static List<Monster> m_monsters = new List<Monster>(); public static List<Player> m_players = new List<Player>(); private Coroutine coroutine; private void Start() { Base_Manager.Stage.M_PlayEvent += OnPlay; Base_Manager.Stage.M_BossEvent += OnBoss; } public void OnPlay() { coroutine = StartCoroutine(SpawnCoroutine()); } public void OnBoss() { if(coroutine != null) { StopCoroutine(coroutine); } for(int i = 0; i<m_monsters.Count; i++) { Base_Manager.Pool.m_pool_Dictionary["Monster"].Return(m_monsters[i].gameObject); //Destroy(m_monsters[i].gameObject); } m_monsters.Clear(); StartCoroutine(BossSetCoroutine()); } IEnumerator BossSetCoroutine() { yield return new WaitForSeconds(2.0f); var monster = Instantiate(Resources.Load<Monster>("Boss"), Vector3.zero, Quaternion.Euler(0, 180, 0)); // 보스 생성 monster.Init(); Vector3 Pos = monster.transform.position; // 같은 변수를 사용할 때는, 한 변수로 묶어서 사용하면 메모리 절약이 됨. (중복계산방지) // 일정 소환거리 내부에 플레이어가 존재하면, 보스 소환 시, 넉백을 합니다. for(int i = 0; i<m_players.Count; i++) { if(Vector3.Distance(Pos, m_players[i].transform.position) <= 3.0f) { m_players[i].transform.LookAt(monster.transform.position); m_players[i].Knock_Back(); } } yield return new WaitForSeconds(1.5f); m_monsters.Add(monster); Base_Manager.Stage.State_Change(Stage_State.BossPlay); } //Random.insideUnitSphere = Vector3(x,y,z) //Random.insideUnitCircle = Vector3(x,y) IEnumerator SpawnCoroutine() { Vector3 pos; for(int i = 0; i < M_Count; i++) { pos = Vector3.zero + Random.insideUnitSphere * 5.0f; pos.y = 0.0f; Vector3 returnPos = Vector3.zero; while (Vector3.Distance(pos, Vector3.zero) <= 3.0f) { pos = Vector3.zero + Random.insideUnitSphere * 5.0f; pos.y = 0.0f; } //몬스터 스폰 var go = Base_Manager.Pool.Pooling_OBJ("Monster").Get((value) => { // 풀링이 생성될때의 기능을 구현한다. value.GetComponent<Monster>().Init(); value.transform.position = pos; value.transform.LookAt(Vector3.zero); m_monsters.Add(value.GetComponent<Monster>()); }); } yield return new WaitForSeconds(M_SpawnTime); coroutine = StartCoroutine(SpawnCoroutine()); } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class Monster : Character { /// <summary> /// 몬스터가 스폰이 될 때, 스케일의 크기변화를 줍니다. /// </summary> /// <returns></returns> IEnumerator Spawn_Start() { float current = 0.0f; float percent = 0.0f; float start = 0.0f; float end = transform.localScale.x; // 몬스터의 로컬스케일 Debug.Log($"몬스터의 로컬스케일 변화 :{transform.localScale.x}"); while(percent < 1) { current += Time.deltaTime; percent = current / 0.2f; float LerpPos = Mathf.Lerp(start,end, percent); // 선형보간 (시작값,끝값,시간) transform.localScale = new Vector3(LerpPos, LerpPos, LerpPos); yield return null; } yield return new WaitForSeconds(0.3f); isSpawn = true; } private void Dead_Event() { if (!isBoss) { Stage_Manager.Count++; Main_UI.Instance.Monster_Slider_Count(); } else { Base_Manager.Stage.State_Change(Stage_State.Clear); } Spawner.m_monsters.Remove(this); Base_Manager.Pool.Pooling_OBJ("Smoke").Get((value) => { value.transform.position = new Vector3(transform.position.x, 0.5f, transform.position.z); Base_Manager.instance.Return_Pool(value.GetComponent<ParticleSystem>().duration, value, "Smoke"); }); Base_Manager.Pool.Pooling_OBJ("COIN_PARENT").Get((value) => { value.GetComponent<Coin_Parent>().Init(transform.position); }); for (int i = 0; i < 3; i++) { Base_Manager.Pool.Pooling_OBJ("Item_OBJ").Get((value) => { value.GetComponent<Item_OBJ>().Init(transform.position); // 몬스터 위치 삽입 }); } if (!isBoss) { Base_Manager.Pool.m_pool_Dictionary["Monster"].Return(this.gameObject); } else { Destroy(this.gameObject); // 보스몬스터는 풀링하지않고 파괴한다. } } }
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
Effect만 이용하고 싶습니다.
Combat 시스템에 effect만 따로 사용하고 싶은데 아래처럼 그냥 사용하면[SerializeField] private Effect stunEffect; playerEntity.SkillSystem.Apply(stunEffect);Effect.cs var stackActions = StackActions.Where(x => x.Stack <= currentStack && !aplliedStackActions.Contains(x) && x.IsApplicable);위의 블록에서 ArgumentNullException: Value cannot be null 오류가 뜨더라구요 아마 StackActions값이 null이라 뜨는 것 같은데Skill을 사용 안하고 Effect를 사용하니 초기화 과정에서 문제가 있는 것 같습니다. 아니면 혹시 다르게 사용할 방법이 있을까 싶어서 질문드려봅니다.
-
해결됨두고두고 써먹는 유니티 VR
실습 오류
2-4 에서는 컨트롤러가 화면과 같이 움직이는데 뭘 잘못한걸까요..3-2에서는 오류가 난다고 뜨며 다시 고쳐도 호박은 움직이지 않고 위치가 바뀝니다..아래 콘솔에서는 오류난다고 막 메세지가 뜹니다..시작하면 위에 것들이 오류가 생깁니다..
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
채팅 시스테 ㅁ구현
안녕하세요! 유니티 초보이지만 개발 경력이 쪼끔 있어 파이누스님의 기초 유니티 강의를 빠르게 듣고 방치형 강의를 들으려고하는 학생입니다. 방치형 게임은 솔로 플레이인데 혹시 다른 유저들과 소통할 수 있는 채팅 기능 구현하는게 있을까요~? 궁금합니다!
-
해결됨새싹부터 시작하는 Unity 게임 개발
Start 자동 완성이 안됩니다.
학습에 관련된 상세한 질문을 남겨주세요 🙂그 외에도 여러분들이 자체적으로 게임을 개발하면서 생긴 여러 오류들도 남겨주신다면 제가 아는 선에서 최대한 답변드리겠습니다 ! 😃
-
해결됨유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
Fade 구현 파트에서 childcount 부분이 헷갈려서요
로비씬 마지막에 Fade 구현 파트에서 UIManager에 CloseUI 함수에서 lastchild 가져오는 부분을 var lastChild = UICanvasTrs.GetChild(UICanvasTrs.childCount - 3); 빼기 숫자를 FadeImg 추가했으니 3으로 수정하는 부분이요. 강의에서도 유니티 창에서 추가 설명해주시긴 했는데 약간 헷갈려서요이 코드 이후에 설명해 주실때 lastChild가 true면 겟 컴포넌트로 BaseUI 컴포넌트 가져오는데 이게 위 코드에서 -3으로 하면 null이 되니까 ... 대략 이런 방식으로 설명 주셨는데 이 부분도 잘 이해가 안돼서요 추가로 더 설명해 주실 수 있을까요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Socket의 Disconnect 해주는 부분에 대해 궁금합니다.
강의들이나 블로그를 보아도 소켓의 연결을 유지해주는 경우는 Receive 부분이나 Send 부분에서 ByteTransferred <= 0 이거나 SocketError != SocketError.Success가 아닐 경우에 Disconnect를 하게 되어있는데 온라인 서버에서는 원래 이렇게 구성을 해주는건가요?이 경우엔 계속 패킷을 보내고 받지 않으면 연결이 끊기는거같아서 ..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send처럼 동시다발적으로 Recv가 발생할 경우 생기는 문제점에 대해 궁금합니다
Session#2 내용까지 보고 질문드립니다.Send 요청이 동시 다발적으로 발생할 경우 send 순서, 처리가 완료 되기 전 buffer를 건드리는 문제, sendAysnc의 동시다발적 발생으로 인한 부하 문제로 Queue를 사용하여 처리를 한다고 이해를 하였습니다 이런 경우를 Receive 쪽에서도 생각해볼 때 한 클라이언트에서 동시 다발적으로 send를 보낸다면 어쨌든 OnCompleteReceive릉 통해 처리될 것이고 그럼 그 요청만큼 다시 RegisterReceive가 실행이 될 것이라고 생각하고 있습니다. 그렇다면 또 그 요청만큼 recvAysnc가 실행될 것으로 예상되는데 이때는 sendAysnc가 동시 다발적으로 실행되는 것과 같이 생기는 부하 문제, 혹은 야기되는 다른 문제점은 없을까요?아니면 비동기로 받아주는게 많은 만큼 recv가 쉬워진다던가..
-
해결됨두고두고 써먹는 유니티 VR
URP 프로젝트
동일한 버전으로 진행하였으나 3d sample scene (URP) 밖에 안 떠서 이거로 프로젝트를 생성했는데, 다음 사진처럼 화면이 뜹니다! 이대로 진행해도 무방할까요? 그리고 핑크색처럼 뜨는 이유가 뭘까요?
-
해결됨[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
소환 위치
안녕하세요 선생님 혹시 나중에 한 자리에같은 속성끼리 3마리 씩 소환예정인가요??아니면 한자리에 한마리만 스폰가능하나요
-
해결됨두고두고 써먹는 유니티 VR
에디터 버전을 영상과 똑같이 사용해도 3D(URP)가 안뜹니다.
에디터 버전은 2021.2.13f을 사용중이고 프로젝트 생성하고 난 뒤3D(urp)가 안뜹니다. 뭔갈 잘못된 걸까요?아니면 다른 코어를 사용해도 괜찮을까요?
-
미해결따라하면서 배우는 고박사의 2D 플랫포머 게임 제작
02-07 별아이템을 bool[] 로 한 이유가 궁금해요.
star 아이템을 획득했을 경우,단 하나의 아이템이라면 star를 획득했는지 여부로, 무언가를 할 지 여부를 결정할 수 있을 것 같은데...bool 값을 배열형태로 갖고 있어서어떤 방식으로 이것을 활용할 건지 저는 상상이 잘 안되요.그래서 강사님께서 의도하신 용도를 알고 싶어요.
-
미해결따라하면서 배우는 고박사의 2D 플랫포머 게임 제작
02-05 플레이어 원거리공격. 혹시 저처럼 공이 빨리 사라지는 경우
혹시 저처럼 공이 빨리 사라지는 경우가 있는 분들을 위해 글을 남깁니다.공을 생성해서 던질때, 공이 지면과 충돌하면서(공이 수평으로 이동하는 것이 아니라, 대각선으로 이동하면서 충돌)약간의 x방향 속도가 줄어들 수 있습니다.아마도 그런 이유 때문인지, 제가 실습해보니, 지면에 닿자마자 공 오브젝트가 모두 사라집니다.그래서 다음 코드를 이렇게 고쳤어요.void Update(){ if ( movement.IsGrounded ) movement.Jump(); if( Mathf.Abs(movement.Velocity.x) < (originSpeed - some)){ Destroy(gameObject); } }movement.Velocity.x < originSpeed 대신에,originSpeed에서 약간의 값을 빼주는 식으로 했습니다.시험해 보니 0.1f 만 빼줘도 되더라구요.some 대신에 직접적으로 0.1f를 넣으시면 됩니다.
-
미해결따라하면서 배우는 고박사의 2D 플랫포머 게임 제작
02-02 플레이어 체력에서 if(current >1)을 if(current > 0) 로...
해야 될 것 같아요.그래야 체력이 0으로 떨어질 수 있고,지금 상태에서는 current가 1일 때 사망처리가 되어 버리는 문제..
-
해결됨두고두고 써먹는 유니티 VR
카메라 로테이션 고정
vr화면을 움직이면 포지션만 변경되고 로테이션은 바뀌지 않는 문제는 뭐가 문제인가요? ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
2분 40초쯤 질문있습니다
SetCanvas함수를 왜 UI_Popup과 UI_Scene에서 호출해야되는지 이해가 되질않네요
-
미해결따라하면서 배우는 고박사의 2D 플랫포머 게임 제작
03-01 Hidden Tilmap에서
StartCoroutine(FadeEffect.Fade(tilemap, tilemap.color.a, 0, tilemap.color.a)); HiddenArea.cs에서 이렇게 작성하셨는데,마지막 인자 값이 tilemap.color.a는 삭제해야 될 것 같습니다.그 위치는 fadeTime 위치이고 디폴트로 1로 해 놨었어요.제 생각이 맞나요?
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
리얼타임 데이터베이스 정렬보기 같은게 있을까요?
파이어베이스 리얼타임 데이터베이스에USER 하위 항목으로 저장된 내용들을 보니까제가 저장에 쓰이게 했던 변수들의 순서 나열과 다르게변수이름 시작부분 a~z 순으로 데이터가 저장되는것 같더라구요.....예를들어 제가 변수를public int zzz;public int ccc;public int aaa;이렇게 코드를 쳤다면........파이어베이스 데이터 쪽에는 (USER 하위에)public int aaa;public int ccc;public int zzz;로.... 제가 코드로 순서 맞춰 쓴 변수와 다르게a순부터 z 순까지 자동정렬 되더라구용;;이거 그냥 a~z순 말고 제가 쓴 변수 순서대로 정렬되서저장되게 하는법이 있을까요??
-
미해결따라하면서 배우는 고박사의 2D 플랫포머 게임 제작
02-04 점프발판 Animation 뷰에서 이미지 나오게 하는 방법이 궁금해요.
제 유니티에서는 이미지가 안보이고, 점으로만 표시가 되요.그래서 챗지피티에게 물어봐도 마땅한 답을 잘 못찾겠어요.스크롤로 확대를 최대한 해도 이미지가 안보여요.무슨 방법 있을까요?
-
미해결따라하면서 배우는 고박사의 2D 플랫포머 게임 제작
02-03 추락하는 발판에서 isKinematic = true;로 하면, 중력영향 안받으니
내용이 너무 좋은 것 같아서 즐겁게 배우고 있다는 이야기부터 전합니다. rb.isKinematic = true; rb.velocity = Vector2.zero; // 사실상 불필요?. 위에서처럼 rb.velocity 값을 Vector2.zero로 할 필요가 없지 않나요?챗지피티에게 물어보면 불필요하다고 하는데... 정확한지 몰라서 여쭙니다.