묻고 답해요
145만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Unity Sound관련해서 iOS와 Android App개발시 질문이 있습니다.
안녕하세요, 최근 회사에서 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을 직접 만드는게 낫다라고 생각이 듭니다.관련해서 도움을 받을 수 있을까요? 앞서 말씀드린것과 같이 강의내용에 벗어난것 같아서 답변주시지 않으셔도 됩니다 감사합니다.
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
GridWorld가 움직이지 않고, time out 으로 중지됩니다.
책을 먼저 사서 책 보고 따라하던 중 막혀서, 급하게 강의 등록하고 질문 드립니다.이렇게 좋은 책과 강의에 우선 감사드립니다.오류 문구는 다음과 같습니다.사용 패키지들의 버전을 다음과 같습니다.책 보고 따라 작성한 코드로 이런 현상이 있어서, github에서 다운 받은 파일로 해도 동일 증상입니다.저의 유니티 상의 설정은 다음과 같습니다. 해결에 도움 주시면 감사하겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
인디게임으로 2D온라인을 만들고싶은데 이 커리큘럼도 들어야하나요?
혹시 저는 인디게임으로 2D온라인을 만들고 싶은데 3강 3D 유니티 강의를 들어야 하나요? 이미 절반정도는 듣기했는데 딱히 3D를 만들생각은 없어서요
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
14:13 Managers.Resource.Destroy 에 대해서
안녕하세요 Rookiss님 강의 잘 듣고 있습니다! 14:13에서 저번시간엔 리소스 매니저 Destroy()를 쓰셨다고 하셨는데, 저번 강의 시간에 비교로 보여주셨던 코드는 GameObject.Destroy()로 파악 해서 질문 드립니다.GameManager의 Despawn()이 풀링 관련 처리가 되어있는 것도 내부에서 리소스 매니저의 Destroy를 호출해서, 그 내부에서 Poolable을 통한 확인이 있었기 때문에 가능하다고 이해했습니다.이번 시간 새로 만든 메서드인 Despawn()과의 비교 대상을 GameObject.Destroy()로 두는 것이 맞을까요?
-
미해결유니티와 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 상태에서 좌클릭을 누르면 공격 모션만 마우스 방향으로만 가고 플레이어는 마우스 방향으로 앞으로 대쉬하지 않습니다. 이때는 어떻게 처리해야 하는 지 알려주시면 감사하겠습니다. 코루틴도 써봤지만 답이 안나와서 올립니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Read 함수
강의를 보고나서 코드를 다시보며 이해를 해보고 있었습니다. ReadOnlySpan을 만들어준 후 count += (ushort)를 2번 해주는데 이 부분이 이해가 안되더라구요 왜 그런건가요 ?
-
미해결[실전 게임 코드 리뷰] 유니티 캐주얼 게임 (엘리스팡)
매니저 옆에 Ex는 무슨 뜻인가요?
GameManagerEx , SceneManagerEx별로 중요한 내용은 아닌 것 같지만궁금합니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
강의 내용을 정리해서 블로그에 포스팅해도 괜찮을까요?
최근에 강의를 구매하고 수강하며 강의 내용들을 필기하고 있는데,혹시 괜찮으시다면 개인적으로 필요한 부분들을 정리해서 출처를 밝히며 블로그에 기록해도 괜찮을까요?
-
해결됨따라하면서 배우는 고박사의 유니티 하이퍼캐주얼게임 시리즈 02
드래그 블록 배치 판정 및 배치 강의 관련 질문드립니다.
안녕하세요 고박사님. 유튜브와 인프런을 통해 강의 잘 듣고 있습니다!질문 드리고 싶은 부분은 "드래그 블록 배치 판정 및 배치" 강의에서 1분44초 즈음 // 현재 위치에 이미 다른 블록이 배치되어 있는지 ? if( !IsOtherBlockInThisBlock(position) ) return false;저는 저 함수명을 보고 position에 해당하는 블록에 다른 블록이 존재한다면 true를 반환시키는 것으로 함수해석을 하였는데 강의를 되돌려보니 블록이 비어 있다면 true로 주석이 있는것을 확인하였습니다.사소한 질문일 수 있지만 충분히 고민해보아도 이해가 잘 되지 않아 올바른 해석법이나 추가설명 부탁드리겠습니다..! 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Packet Generator#2 string부분
안녕하세요이 부분까지는 실행이 잘되는 것을 확인하였습니다.그 뒤에 PacketFormat 부분에서실행시키면 아래와 같이 string부분은 입력이 안됩니다. 제 코드에서 틀린부분을 못찾겠어서 선생님이 올려주신 정답 코드로 다시 실행을 해보았는데똑같이 string부분이 입력이 안되는데 혹시 어떤 부분이 잘못되었는지 알려주실 수 있으실까요? class PlayerInfoReq { public long playerId; public void Read(ArraySegment<byte> openSegment) { ushort count = 0; ReadOnlySpan<byte> s = new ReadOnlySpan<byte>(openSegment.Array, openSegment.Offset, openSegment.Count); count += sizeof(ushort); count += sizeof(ushort); this. playerId = BitConverter.ToInt64(s.Slice(count, s.Length - count)); count += sizeof(long); } public ArraySegment<byte> Write() { ArraySegment<byte> segement = SendBufferHandler.Open(4096); bool success = true; ushort count = 0; Span<byte> s = new Span<byte>(segement.Array, segement.Offset, segement.Count); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count,s.Length-count), (ushort)PacketID.PlayerInfoReq); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), this. playerId); count += sizeof(long); success &= BitConverter.TryWriteBytes(s, count); if (success == false) return null; return SendBufferHandler.Close(count); } }
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
싱글에이전트 코드를 멀티에이전트 코드로 수정 관련
안녕하세요.좋은 강의 올려주셔서 항상 감사하게 보고 있습니다.파이썬 코드로 학습 코드를 작성할때 싱글에이전트만 고려한다고 하셨는데 멀티에이전트를 위한 코드를 작성하려면 바뀌는 부분이 많이 있나요?멀티에이전트를 위해서 코드를 수정한다면 참고할 수 있는 자료가 있을까요?적용하고 싶은 알고리즘은 ppo 입니다.감사합니다!
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
스크립트 변수명, 함수명 등 바꿀 때 팁이라고 해야할까요?
중복이면 죄송합니다.바꾸실 이름에 커서를 두고 Ctrl + R(두번)을 누르시면 이름 바꾸기가 나오는데 바꾸실 이름을 입력하고 엔터를 누르시면 참조되어 있는 것들 싹다 변경됩니다.
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Create()에 대해 궁금한 부분이 있습니다
복습 중 아리까리한 부분이 있어서 질문드립니다.// ResourceManager public GameObject Instantiate(string path, Transform parent = null) { // ... // 풀링된 객체라면 풀에서 가져온다. if (original.GetComponent<Poolable>() != null) return Managers.Pool.Pop(original, parent).gameObject; // ... } // pool Poolable Create() { GameObject go = Object.Instantiate<GameObject>(Original); go.name = Original.name; return go.GetOrAddComponent<Poolable>(); }위 코드에서 Poolable 컴포넌트를 가지고 있는 오브젝트만 Managers.Pool.Pop(origian, parent)를 진행하기 때문에 Create()까지 타고 넘어오는 오브젝트는 Poolable 컴포넌트를 갖고 있는 오브젝트들이고, pool에 push하는 부분에서 혹시나 Poolable컴포넌트를 빼먹지 않기 위해 반환 타입이 go.GetOrAddComponent<Poolable>();로 되는 것인가요?Create의 대상이 Poolable을 무조건 가지고 있다고 가정하고 작성했기 때문에 GetOrAddComponent를 사용하는 것이라고 이해하는게 맞는지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
UI 자동화 장점
예전에 회사에서 유니티로 어플을 만들 때 버튼 클릭할 때 나오는 사운드를 BUTTON 컴포넌트에 함수로 매핑을 해준 적이 있었습니다. 드래그앤드롭으로 인스펙터창에 붙였었는데, 유지보수 측면에서 함수의 이름을 바꿔야할 상황이 왔었는데 함수 이름을 바꾸니 제가 프로젝트의 버튼에 매핑 시켰던 모든 버튼 클릭 함수가 Missing이 떴었습니다. 이 때, 루키스님의 UI 자동화의 장점을 뼈저리게 느꼈었는데 혹시 이런 상황 말고도 루키스님이 자주 쓰시고 저희에게 가르쳐주신 UI 자동화만의 장점이 있을 까요?? 단점도 궁금합니다(아마 단점은 하나의 Scene에서 게임 오브젝트의 이름이 같은 게 2개 이상 있으면 정상 동작하지 않는다 인 것 같은데 맞을까요? 그 외의 단점도 궁금합니다!!)
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
유니티 vscode 연결
유니티에서 external code editor 선택하는 창에서 vscode가 뜨지 않았습니다. 그래서 browse를 통해 선택해주었는데요. 그리고 스크립트를 실행해보니 External Code Editor application path does not exist 라는 문구와 함께 에러가 발생하고 monobehavior도 초록색으로 바뀌지 않으며 정상적으로 연결이 되지 않는 것 같습니다. 이걸로 몇 시간동안 끙끙댔는데 진전이 없네요;; 도움이 필요합니다.
-
해결됨[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
해당 강좌 내용을 PC게임 제작에 접목해도 괜찮을까요?
강의 내용이 모바일 플랫폼을 기준으로 하고 있는데 이 내용을 pc게임에 적용해도 괜찮을지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
옵저버 패턴을 잘 모르겠습니다
구글에 찾아보니 설명이옵저버패턴이란 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴입니다.이라고 되어있는데 이번수업에서의 경우엔 객체가UI_EventHandler이고 옵저버가UI_Button인건가요? 또한, Action이 여러 함수포인터를 저장해놓고 Invoke를 호출할때마다 저장된 함수포인터들을 전부다 사용하는것이라고 이해해도 되는걸까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
start문에 디버깅을찍어도 안들어갑니다.
혹시 짐작가는 부분이있으실까요? 코드는 영상보며 여러번체크해서 다른점은 없는것같습니다.. 이렇게 그냥 단순 디버그문을 만들어서 찍어도 브레이크포인트에 안걸리고 그냥 실행이되네요
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
Start와 awake 함수의 차이점이 궁금합니다.
스크립트 설명 강의에서 Start와 awake 함수의 차이점이 궁금합니다.
-
미해결[유니티 3D] 실전! 생존게임 만들기 - Advanced
navigation bake한 후 오류
navigation bake한 후에 돼지를 때리는데 돼지를 raycast의 hitinfo로 가져오지 못하네요 왜 그런 걸까요?closeWeaponController의 CheckObject()메소드입니다layerMask에는 player랑 ignoreRaycast만 체크해제 되어 있어요 protected bool CheckObject() { if (Physics.Raycast(transform.position, transform.forward, out hitInfo, currentCloseWeapon.range, layerMask)) { Debug.DrawRay(transform.position, transform.forward * 15, Color.red); Debug.Log("raycast 체크 오브젝트" + hitInfo.transform.name); return true; } return false;