unitychan Animation
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
unitychan이 마우스를 클릭해서 움직이면 잘 움직이는데 마우스를 손에서 떼면 벽을 보고 뛰는 모양이 계속 발생합니다. 어디가 잘못된 걸까요 ?
- C#
- unity
173만명의 커뮤니티!! 함께 토론해봐요.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
unitychan이 마우스를 클릭해서 움직이면 잘 움직이는데 마우스를 손에서 떼면 벽을 보고 뛰는 모양이 계속 발생합니다. 어디가 잘못된 걸까요 ?
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 선생님! 강의 잘 듣고 있습니다 유니티 연동하면서 간혹 클라에서 서버로 보내는 과정에서 세션 클래스의 SendAsync 부분이 예외를 발생시켜 pendinglist 를 비워주는 clear 함수를 호출 하지 못해 if (_pendingList.Count == 0) RegisterSend(); 영원히 send가 막히는 경우를 발견했습니다 try { bool pending = _socket.SendAsync(_sendArgs); if (pending == false) OnSendCompleted(null, _sendArgs); } catch (Exception e) { RegisterSend(); // 수정한 부분 Console.WriteLine($"RegisterSend Failed {e}"); } 이렇게 RegisterSend(); 를 다시 호출해서 SendAsync 가 될때까지 시도를 하는 방식으로 고쳤더니 send가 막히는 현상을 없애기는 했습니다만 제가 생각하는 이 대처방법의 문제는 sendAsync가 계속 예외를 발생시키면 무한루프를 만들어서 이게 맞는 대처방법인지 의문이 듭니다...
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
A*알고리즘이 G는 시작점에서 해당 좌표까지 이동하는데 드는 비용이고 H는 목적지로부터 얼마나 가까운지를 따지는 비용이라고 알고 있었는데 맵매니저를 만들 때 G를 왜 0으로 두는지 잘 이해가 안되고 H는 원래 (목적지까지 남은 X 방향의 타일 + Y 방향의 타일)로 계산했었는데 (목적지까지 남은 X 방향의 타일^2 + Y 방향의 타일^2)으로 바뀐건지 잘 이해가 안됩니다ㅠㅠ
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
플레이어가 몬스터 캡슐콜라이더를 자꾸 올라타는 현상이 생기는데 해결방법이 무엇이있을까요 ? 강의에선 올라타는현상이 없는데 AI navigation을 활용해야하는 부분인가요? ㅜㅠ
해결됨
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
안녕하세요, 클라 개발자 취준생입니다. 최근에 유니티로 클라이언트 포트폴리오 개발을 하고 있는데 다른 이력서랑 경쟁력이 떨어지는것같아서 클라는 Unity,C# , 서버는 IOCP,C++로 개발을 진행해서 클라+서버 연동 포트폴리오를 만들고싶은데요 루키스 선생님 강의중에 어떤 강의들을 구매해서 들어야하는지 조언 부탁드립니다. 중복된 강의 갯수가 많아서 어떤 강의를 선택해서 들어야 하는지 궁금합니다. C, C++, C#, DirectX은 선수지식이 있습니다.
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요! 우선 좋은 강의 만들어 주셔서 감사합니다. 공부를 하다가 문득 온라인 게임 서버가 보통 어떤 운영체제에서 서비스되는지 궁금해졌습니다. 보통 웹 서비스를 리눅스로 많이 운영하다 보니 게임 서버 쪽도 차이가 없을 것으로 생각했는데, 국내에는 윈도우를 많이 사용한다는 이야기가 있더라구요. 근데 워낙 오래전 글을 본 것이라 현재도 그러한지 궁금하네요. 온라인 게임하면 보통 굵직한 회사로 넥슨과 NC가 있을 것 같은데요. 현업 관계자로서 보셨을 때 두 회사에서 주로 어떤 운영체제로 서비스하는지 자그마한 힌트를 주실 수 있을까 조심스레 여쭤봅니다!
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
선배님 DFS 순회 순서에 대해 질문이있어서 글 남깁니다. void DFS(int now) { //전위 cout << now << endl; visited[here] = true; for(int next = now ; next < length ; ++next) { if(visited[next]) continue; } //후위 cout << now << endl; } 질문 1. 주석에 써넣은대로 전위 후위 순회가 맞나요? 질문 2. 그래프에는 중위 순회가 존재하지 않는건가요? 질문 3. visited[here]의 위치는 항상 포문 위쪽에 고정되어야 하는건가요? 후위순회라면 방문 기록도 밑에 있어야할 것 같은데 포문 아래쪽에 작성하게 되면 동작이 원하는대로 되지 않아서요.. 이해를 잘못한건지ㅠㅠ 궁금합니다
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
단순히 const int 변수값 이렇게 선언하는 방법 말고 class에 enum Choice { Scissors = 0, Rock = 1, Paper = 2 } 이렇게 선언해야만 하는 경우도 있나요? 굳이 열거형을 이렇게 사용하는 이유가 따로 있는지 궁금합니다~
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
유니티 매뉴얼에 찾아봐도 네비게이션에 대한 안내도 없고 2021.3 버전에는 있는것 같은데 (window-AI-Navigation) 2022.3 버전에는 네비게이션이 없는것 같은데 없어진 기능이 맞나요 ? 그래서 레이캐스팅의 레이어마스크를 Wall에서 Default로 다시 원복하고, 빌딩의 Mesh Collider와 Unity_Chan의 Capsule Collider 의 충돌로 그냥 활용하였는데 큰 문제는 없겠죠 ? (건물의 벽을타고 올라가는 현상과 건물을 뚫고 지나가는 현상을 모두 수정하기 위함)
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
저는 큐브를 선택하든 안하든 애니메이션 이벤트를 생성하면 3:40초 처럼 Function Float Int String Object가 안뜨고 function만 뜨는데 왜 그런건가요? 유니티버전은
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요, 최근 회사에서 Unity로 Sound Heavy한 프로젝트를 진행하고 있는데, 유니티로 iOS, Android앱을 만드는 중에 있습니다. 사실 강의내용에 벗어난 내용인것 같아서 질문드리지 않는게 좋다고 생각했지만, 정말 많은 리서치를 했음에도 해결하지 못해서 Sound관련 강의를 모두 수강하고 한번 여쭤보게 됬습니다. iPhone 오른쪽에 전원버튼 눌러서 Background 모드로 전환되면(화면을 꺼버리면) Play, PlayOneShot과 같은 Unity API를 사용하지 못하고 결정적으로 Update함수가 실행자체가 안되는데요, 제가 Update함수에 Sound Play관련된 코드를 작성해 놓았는데, 저는 이게 화면을 꺼도 플레이가 될거라고 생각했었는데되지않아서 해결중에 있습니다. 이걸 혹시 Background 모드여도 Sound를 Play할수 있게끔 할수 있을까요?? 유니티 공식 Discord에도 물어봤는데, 애초에 화면이 꺼지면 게임을 플레이를 하는게 아니니까 당연히 Update함수는 안돌아가게끔 디자인하지 않겠냐고 답변을 줘서 정말 맞는말인것 같아서 제가 해당 앱을 개발할때 애초에 Unity를 선택한게 잘못된것같다라는 생각이 듭니다. 현재로서는 iOS와 Android Native Code를 각각 개발하는것이 해결방법이라고 생각하고 있는데, 그럴꺼면 그냥 차라리 애초에 Unity로 앱을 만들지 않고 Native App을 직접 만드는게 낫다라고 생각이 듭니다. 관련해서 도움을 받을 수 있을까요? 앞서 말씀드린것과 같이 강의내용에 벗어난것 같아서 답변주시지 않으셔도 됩니다 감사합니다.
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
혹시 저는 인디게임으로 2D온라인을 만들고 싶은데 3강 3D 유니티 강의를 들어야 하나요? 이미 절반정도는 듣기했는데 딱히 3D를 만들생각은 없어서요
미해결
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
BFS 알고리즘을 배우고 난뒤 시간복잡도에 대해 생각이 많아집니다. BFS알고리즘의 시간복잡도는 O(N^2)인데 사진을 보시면 O(N^2) 부터는 Horrible 단계이므로 사용을 별로 권장하지 않는 것 처럼 보이는데 O(N^2)까지는 어쩔수 없이 종종 사용하게 되는걸까요? (2^n 까지만 가지 않는다면 괜찮은걸까요?!)
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
안녕하세요 Rookiss님 강의 잘 듣고 있습니다! 14:13에서 저번시간엔 리소스 매니저 Destroy()를 쓰셨다고 하셨는데, 저번 강의 시간에 비교로 보여주셨던 코드는 GameObject.Destroy()로 파악 해서 질문 드립니다. GameManager의 Despawn()이 풀링 관련 처리가 되어있는 것도 내부에서 리소스 매니저의 Destroy를 호출해서, 그 내부에서 Poolable을 통한 확인이 있었기 때문에 가능하다고 이해했습니다. 이번 시간 새로 만든 메서드인 Despawn()과의 비교 대상을 GameObject.Destroy()로 두는 것이 맞을까요?
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
MyLinkedList를 제작하면서 C#의 LinkedList의 시간복잡도는 결국 O(1)로 실행되는 것인데, 만약 해당 List를 사용하면서 특정한 값을 찾거나, 제거하고자 할때, 연결리스트의 경우 해당 지점으로 바로 이동할 수단이 없어 Head 부분에서 Tail까지 순차적으로 탐색하여 찾는 방법이기에 O(N)이 시간복잡도가 되어버린다는 것인데, 그렇다면 기존에 말씀하셨던 어떠한 용도로 사용하느냐에 따라 알고리즘의 시간복잡도가 바뀔수 있다는 점이 이 부분에서 나타났다고 보면 될까요? 추가로, 기존에 연결 리스트의 장점으로는 다른 배열과는 다르게 중간에 추가로 방을 생성 할 수 있다는 장점이 있다고 하셨는데, 해당 기능을 어떻게 구현할지는 알겠는데 C# LinkedList의 빠른 함수?(AddLast같은)로 정의된 것은 없을까요? 또한 중간 지점에 값을 넣는 경우도 이전 동적 배열에서 사례와 같이 최악의 경우를 고려해야 하므로 이 기능또한 구현한다면 O(N)으로 생각하면 될까요?
미해결
C# 처음부터 배우기
실행을 하면 F5를 누르면 콘솔창이 바로 꺼져버려요 Ctrl + F5를 누르면 콘솔창이 바로 꺼지지는 않는데 ????d이렇게 나옵니다
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
함수를 인자로 가진다. 그로인해 delegate로 선언된 모든 함수를 원할때 꺼내 쓸 수 있다. 객체를 통해 선언할 경우, 함수를 원하는 순서대로 체인을 걸어 실행되게 할 수 있다. delegate로 선언된 함수는 해당 cs파일이 아닌 다른 cs파일에서도 바로 이용 가능하다. 가 맞을까요?
미해결
유니티와 C#으로 배우는 카타나제로스타일 게임만들기 (기본편)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class VPlayer : MonoBehaviour { #region 변수 모음 public float speed; public float power; public Vector3 direction; Animator pAnimator; Rigidbody2D pRig2D; SpriteRenderer sp; GrapplingHook grappling; // GrapplingHook C# 코드 불러오기 #endregion #region 점프 변수 모음 [Header("Jump System")] [SerializeField] float jumpUp; [SerializeField] float fallMultiplier; [SerializeField] float jumpTime; [SerializeField] float jumpMuitiplier; Vector2 vecGravity; bool isJumping; float JumpCounter; #endregion #region 벽 점프 변수 모음 [Header("Wall Jump System")] public Transform wallChk; public float wallchkDistance; public LayerMask wLayer; bool isWall; public float slidingSpeed; public float wallJumpPower; public bool isWallJump; float isRight = 1; #endregion #region 공격 관련 변수 [Header("Attack System")] public GameObject Vslash; // 공격 모션 #region 마우스 관련 변수 모음 Vector2 MousePos; Vector3 dir; float angle; Vector3 dirNo; #endregion #endregion #region 초기화 void Start() { pAnimator = GetComponent<Animator>(); pRig2D = GetComponent<Rigidbody2D>(); direction = Vector2.zero ; sp = GetComponent<SpriteRenderer>(); grappling = GetComponent<GrapplingHook>(); vecGravity = new Vector2(0, -Physics2D.gravity.y); } #endregion void Update() { if (!isWallJump) { KeyInput(); Move(); mousePos(); } #region 점프 키 누름 if (Input.GetKeyDown(KeyCode.W)) { if (pAnimator.GetBool("Jump") == false) { Jump(); isJumping = true; JumpCounter = 0; pAnimator.SetBool("Jump", true); //JumpDust(); } } #endregion #region 점프 후 떨어질 때 가속 if (pRig2D.velocity.y < 0) { pRig2D.velocity -= vecGravity fallMultiplier Time.deltaTime; } #endregion #region 점프 키를 꾹 눌렀을 시 더 높이 점프 if (pRig2D.velocity.y > 0 && isJumping) { JumpCounter += Time.deltaTime; if (JumpCounter > jumpTime) isJumping = false; pRig2D.velocity += vecGravity jumpMuitiplier Time.deltaTime; } if (Input.GetKeyUp(KeyCode.W)) { isJumping = false; } #endregion #region 벽인지 체크 isWall = Physics2D.Raycast(wallChk.position, Vector2.right * isRight, wallchkDistance, wLayer); pAnimator.SetBool("Wall", isWall); #endregion #region 벽타기 if (isWall) { isWallJump = false; pRig2D.velocity = new Vector2(pRig2D.velocity.x, pRig2D.velocity.y * slidingSpeed); #region 벽을 잡고 있는 상태에서 점프 if (Input.GetKeyDown(KeyCode.W)) { isWallJump = true; //벽점프 먼지 //GameObject go = Instantiate(walldust, transform.position + new Vector3(0.6f * isRight, -0.32f, 0), Quaternion.identity); //go.GetComponent<SpriteRenderer>().flipX = sp.flipX; Invoke("FreezeX", 0.3f); pRig2D.velocity = new Vector2(-isRight wallJumpPower, 0.9f wallJumpPower); sp.flipX = sp.flipX == false ? true : false; isRight = -isRight; } #endregion } #endregion } private void FixedUpdate() { #region 바닥 감지 레이저 Debug.DrawRay(pRig2D.position, Vector3.down, new Color(0, 1, 0)); RaycastHit2D rayHit = Physics2D.Raycast(pRig2D.position, Vector3.down, 0.8f, LayerMask.GetMask("Ground")); #endregion #region Ground를 감지할 때 if (pRig2D.velocity.y < 0) { if (rayHit.collider != null) { if (rayHit.distance < 0.6f) { pAnimator.SetBool("Jump", false); } } #region 6-2. 떨어질 때의 감지 방식 else { if (!isWall) { //그냥 떨어지는 중 fall pAnimator.SetBool("Jump", true); } else { //벽타기 pAnimator.SetBool("Wall", true); } } #endregion } #endregion } #region 키 입력 void KeyInput() { direction.x = Input.GetAxisRaw("Horizontal"); #region 왼쪽 if (direction.x < 0) { //left sp.flipX = true; //점프벽잡기 방향 isRight = -1; pAnimator.SetBool("Run", true); } #endregion #region 오른쪽 else if (direction.x > 0) { //right sp.flipX = false; //점프벽잡기 방향 isRight = 1; pAnimator.SetBool("Run", true); } #endregion #region Idle 상태 else if (direction.x == 0) { pAnimator.SetBool("Run", false); } #endregion #region 공격 버튼 if (Input.GetMouseButtonDown(0)) { pAnimator.SetTrigger("Attack"); //Instantiate(hit_lazer, transform.position, Quaternion.identity); } #endregion } #endregion #region 이동 void Move() { if (direction.x != 0) { if (grappling.isAttach) { pRig2D.AddForce(new Vector2(direction.x * speed, 0)); //로프 이동 } else pRig2D.velocity = new Vector2(direction.x * speed, pRig2D.velocity.y); //보통 이동 } } #endregion #region 점프 public void Jump() { pRig2D.velocity = new Vector2(pRig2D.velocity.x, jumpUp); } #endregion #region 마우스 방향 public void mousePos() { Transform tr = GetComponent<Transform>(); MousePos = Input.mousePosition; MousePos = Camera.main.ScreenToWorldPoint(MousePos); Vector3 Pos = new Vector3(MousePos.x, MousePos.y, 0); dir = Pos - tr.position; // 바라보는 각도 구하기 angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg; } #endregion #region 공격 이펙트 public void AttSlash() { pRig2D.AddForce(dir.normalized * power, ForceMode2D.Impulse); GameObject go = Instantiate(Vslash, transform.position, Quaternion.identity); if (dir.x <= 0) { sp.flipX = true; } else { sp.flipX = false; } } #endregion void FreezeX() { isWallJump = false; } } 마우스 방향 값을 이용해 좌클릭을 할 때 마우스 방향으로 공격을 하는 코드를 짜고 있는 데, 이동을 velocity로 해서 그런지 idle 상태 run 상태에서 좌클릭을 누르면 공격 모션만 마우스 방향으로만 가고 플레이어는 마우스 방향으로 앞으로 대쉬하지 않습니다. 이때는 어떻게 처리해야 하는 지 알려주시면 감사하겠습니다. 코루틴도 써봤지만 답이 안나와서 올립니다.
미해결
WPF (.NET Core, C#, 자막제공)
안녕하세요. 6)Trigger강의중 Trigger Property 설정에서 Control.IsMouseCaptured를 사용 할 수가 없습니다. ItemControl로 변환을 유도하는데 정작 ItemControl에는 IsMouseCaputred 구문이 없습니다. Setter 설정 시에도 Control. Foregruund 가 에러가 나서Property="ItemsControl.Foreground" 로 진행하였습니다. 추가) 해당 구문을 다시 강제(?)로 입력하여 동작 확인 하였습니다. <Trigger Property="Control.IsMouseCaptured" Value="True"> <Setter Property="Control.Foreground" Value="Blue"> </Setter> </Trigger>
해결됨
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의를 보고나서 코드를 다시보며 이해를 해보고 있었습니다. ReadOnlySpan을 만들어준 후 count += (ushort)를 2번 해주는데 이 부분이 이해가 안되더라구요 왜 그런건가요 ?