여기에서 중요 포인트는 1. 골드 Item 만들 때 : IsTrigger : 체크 필요. 2. OnDie(); 함수 호출 때 : 유니티에서 GameManager에 Player 연결해주는 것(드래그앤 드롭) 3. 35:00 쯤에서 UI 코딩 할 때 using UnityEngine.UI; 이것 부터 선언해 줘야함 4. Text Mesh Pro 사용하는 사람은 using TMPro; public TextMeshProUGUI UIPoint; public TextMeshProUGUI UIStage; 로 사용 하면 됨 5. 40:10분 쯤 SceneManager.LoadScene(0); 를 할 땐 using UnityEngine.SceneManagement; 선언문 필요 6. Audio 출력 할 때 마지막에 audioSource.Play();를 넣어줘야함 (Swich 문 할때) 골드 메탈님 덕분에 많은 것을 배웠습니다. 감사합니다!!
26:18초 혹시 케릭터가 죽고나서 뒤집힌 채로 떨어지지 않는 부분에 문제가 있으신분들은 맨 위에 public class에 예를들어 CapsuleCollider2D capsule_pl; 이름을 지어주시고 void Awake항목에 capsule_pl = GetComponent(); 이렇게 적으신다음에 public void OnDie()함수에서 capsule_pl.enabled = false;를 적는다면 케릭터 문제를 벗어날 수 있습니다
몇가지 수정이 필요하거나 있으면 좋을 것 같은것들 (이것이 단순히 제가 수업을 제대로 따라가지 못해 발생한것들이라면, 죄송합니다 ^^;7) 1.피격 무적시간중에 낭떠러지로 떨어지면, 시작 위치로 이동이 안됨 2.피격 무적시간중에 적을 밟을 수 있으면 좋겠음 (충돌 검사가 아예 없다보니...) 3.가시를 위에서 밟을경우 피격 처리가 제대로 안됨 (가시를 몬스터와 같은 태그와 두다보니 게임이 "몬스터를 밟은것"이라 생각해서 Null Reference만 뜨는데, 태그를 별도로 지정하면 해결될 듯) 4.구덩이나 벽 등 조금 더 특수한 지형에서의 몬스터 AI 구현 (벽을 만난 몬스터는 즉시 Turn을 호출하거나, 양옆으로 벽이 있으면 nextMove를 0으로 고정하거나...) 5.플레이어 사망 후에 조작이 불가능하게 막을 것 6.슈퍼점프 등 점프력이 일정하지 않은 점 해결 (피격당하거나 몬스터를 밟기 직전 velocity를 0으로 - 근데 어떤 게임에서는 이런것들을 일부러 남기는 경우도 있음) 7.큰 맵에는 체크포인트를 둬서, 낭떠러지에 떨어지면 시작지점이 아닌 체크포인트에서 리스폰되게 물론 이런저런 수정할 점이나 추가할 점이 있다고 강의의 질이 떨어진다고 비난하는것은 아닙니다! 이런것들은 일종의 과제라고 생각하겠습니다, 좋은 강의 감사합니다!
35:02 에서 public Text 부분과 public Image[] 부분이 빨간줄로 계속 그어지면서 없는걸로 뜨는데 따로 뭐 설정이 필요한가요?/// 수정 아 동영상 슬로우로 계속 정지하면서보니 위에 using UnityEngine.UI; 을 선언해야되는군요... 만약 막히시는분 있으면 참고하세요
너무 재미있어서 잠도 줄여가면서 따라 만들었네요ㅎㅎ 혼자 뽈뽈거리며 움직이는 몬스터를 봤을 때의 감격과, 분명 잘 따라한 것 같았는데, 몇시간동안 찾아봐도 안풀리는 문제에 의한 혼란과 스트레스.. 그리고 그것이 단순한 실수 때문이라는 것을 알았을 때 드는 허망함과, 그래도 포기하지 않고 해결해냈다는 뿌듯함이란... 덕분에 참 다양한 경험을 하고있네요ㅋㅋ 정말 감사드립니다!
정말 감사합니다 골드메탈님!! 게임 개발에 관심을 가지게 되어서 유니티로 2D 플랫포머 게임만들기에 도전중인데 첫 강의부터 끝까지 정말 행복하게 봤습니다... 드릴 수 있는건 없구 정말 감사했다는 말씀 드리고 싶네요!! 앞으로도 모든 강의 다 보겠습니다 ㅎ_ㅎ 정말 명강의에요!
수정할 것 1. 비탈길 미끄러짐 -> 해결 완료. isKinematic 이용시 버그가 많아 Freeze Position 이용 2. 피격에 의해 죽을 시 DIE사운드 미출력 -> 해결 완료. 해당 영상 댓글에 있는 코루틴 이용 3. 가시, 적이 겹쳐 있을 시 체력이 여러 번 감소 -> 해결 완료. bool값 이용 4. 무적 시간 동안 적 공격 불가능 -> 해결 완료. 플레이어 안에 빈 객체 생성 후, isTrigger collider을 발밑에 두고 OnAttack로직을 OnTriggerEnter로 이동 5. 내리막길 공중으로 뜸 -> 해결 완료. raycast 및 gravityScale 이용
골드메탈님 저만 겪은 현상인지는 모르겠는데 몬스터 밟았을 때 Invoke("DeActive", 5f);가 실행 안되고 그냥 지나가는 현상이 있었습니다. 그래서 enemy가 비활성화가 안되는 문제가 있었고 1시간 정도 지나 해결했는데 몬스터가 떠오르면서 레이에 닿는것이 없어져 turn이 실행되고 거기서 CancelInvoke();에 의해 모든 invoke가 실행안되는게 원인 같습니다. 그래서 CancelInvoke("Think");로 해줬더니 바로 해결되었습니다.
혹시나 같은 오류로 고생하실 분들을 위해 남깁니다. 몬스터와 충돌했을 때는 문제가 없지만 가시와 위에서 충돌했을때 게임 화면이 튕기며 씬 화면으로 전환되며 Nullreferance 오류가 나는 분들은 몬스터와 가시가 둘 다 태그가 enermy로 묶여있지만 가시에는 위에서 떨어졌을 때 처리할만한 스크립트가 들어가지 않아 발생하는 오류로 보입니다. 가시와 몬스터의 태그를 분리시켜주면 해결됩니다.
40:38 처럼 retry 가 나와야 하는데 안나오고 계속 오류가 이런식으로 뜹니다 UnassignedReferenceException: The variable UIRestartBtn of GameManager has not been assigned. You probably need to assign the UIRestartBtn variable of the GameManager script in the inspector. 어떻게 해야하나요?
41:07 이 부분에서 갑자기 코드가 변하는데 ViewBtn();이 어디서 나온건가요? 저대로 코드를 쓰니까 Assets\Scripts\GameManager.cs(46,13): error CS0103: The name 'ViewBtn' does not exist in the current context 이런 오류가 뜨고 스테이지가 다 끝나도 Clear 버튼이 안 뜹니다
41:21 여기서 85번째 줄부터 새롭게 ViewBtn 함수 작성했고 그걸 63번재 줄에서 호출하고 있습니다. 혹시 모르니 이와 관련된 코드 아래에 작성해드릴께요. public void HealthDown() { if(health > 1) { health--; UIhealth[health].color = new Color(1, 0, 0, 0.4f); } else { //All Health UI Off UIhealth[0].color = new Color(1, 0, 0, 0.4f); //Player Die Effect player.OnDie(); //Retry Button UI Invoke("ViewBtn", 3); //3초 뒤에 재시작 버튼 보여주기 } } void ViewBtn() { UIRestartBtn.SetActive(true); }
가시를 밟는 행동을 하면 NullReferenceException: Object reference not set to an instance of an object Move.OnAttack (UnityEngine.Transform enemy) (at Assets/Script/Move.cs:141) Move.OnCollisionEnter2D (UnityEngine.Collision2D collision) (at Assets/Script/Move.cs:94) 이렇게 오류가 나는데 이건 어떻게 해결하나요?
골든메탈님! 몬스터 사망 모션 할 때 뒤집어진 상태로 떨어지는데 이 때 위에 벽이 있으면 레이 케스트가 연속으로 발동해 좌우반전이 계속 되는 현상이 생기네요. 저는 그냥 처음에 int death = 0;하고 레이케스트 발동 조건을 if문if( death == 0);으로 감싸서 실행 시킨다음 죽는 함수 맨처음에 death = 1;를 발동시켜 레이케스트를 발동하지 못하게 만들었습니다. 결국에 해결은 했는데 괜히 int 하나 더 만든 느낌이라 불편합니다. 뭔가 좀 더 좋은 수가 있었을까요?? 항상 골든메탈님은 간편하거나 코드 몇줄이나 쭐일수 있는 방법을 사용하시던데 좋은 수가 궁금합니다.
같은 케이스인지는 모르겠지만 저도 좌우반전이 빠르게 일어나는 현상을 겪었습니다. 적 이동 중에 밟았을 때 이런 현상이 나타나더군요. 저같은 경우 원인은 아마도 rayHit에 null이 아니었을 때 실행되는 조건문이 FixedUpdate에서 반복 실행되니 turn()함수가 그대로 반복되는 거였습니다. 밟았을 때 nextMove가 0이 되게 만들어서 해결했습니다.
골드메탈님! 좋은강의 정말 잘 들었습니다ㅎ 이 게임을 완성도 높게 만드려고 이것저것 찾아보면서 게임을 채우고있어요 하던 중 오류? 아닌오류를 발견했는데 높이있는 플랫폼에 점프를하면 가끔 isjuming 상태가 해제되지 않아서 애니메이션도멈추고 또 다시 점프를 못하는상황이와요 또 내리막길에서 한번 점프를하면 착지후부터 평지까지도 같은 상태가 발생되구요 뭐때문에 그런걸까요ㅠㅠ..?? 혼자 고민하고 이것저것 만져보다 못알아내서 댓글남겨용
와우 ~ "유니티 강좌 기초 채널 Basic" 정주행 해서 ~ 드뎌 첫 게임 완성되었네요 ~ 설명을 너무 잘 해주셔서 감사합니다. ~ ^^;; 저도 이렇게 게임 개발이 시작되려나 봅니다. ~ ㅎㅎ 이와중에 질문이 ~ 윈도우 빌드하면 전체화면만 되는데 해상도를 작게나 바꿀수 있는 기능은 어디에서 찾을 수 있나요 ??
2018까지는 게임 실행하면 Config 창이라고 해서 기본으로 있던 기능이었습니다만, 사용 빈도가 많이 줄어서 2019버전부터 삭제되었습니다. 창모드는 Player Setting에서 설정 가능합니다. 해상도는 코드로 구현해주셔야 해요. docs.unity3d.com/kr/2019.4/Manual/class-PlayerSettingsStandalone.html
안녕하세요 좋은 강의 감사드립니다:) 하나의 궁금증이 생겨서 질문남깁니다!! 플레이어의 OnAttack함수에 Transform을 넘겨주는 이유가 궁금합니다...! 제가 생각했을 때 조금 더 의미적으로, "충돌한 게임 오브젝트를 넘겨준다"라고 생각하여 collision.gameObject를 넘겨주어야하는것이 아닌가?라는 생각이 들었습니다 결국 EnemyMove라는 컴포넌트는 게임오브젝트에 부착이 되는것이지, 오브젝트의 트랜스폼에 부착되는것이 의미적으로는 아니라는 생각이 들어서요...! transform에서 EnemyMove라는 컴포넌트를 찾아도 잘 작동하는 이유가 모든 게임오브젝트는 트랜스폼을 가지기에 가져올 수 있는것이 맞을까요????
올려주시는 영상 보면서 유니티 공부하고 있습니다. 감사합니다!! 그런데 몬스터가 움직일때 공격을 하면 빙글빙글 돌면서 죽더라구요 if문을 넣으면 된다고 답변해주신걸보고 혼자 시도 해봤는데 잘 되지 않았습니다. 혹시 괜찮으시다면 구체적으로 어떤 문장을 넣어야하는지 알려주실수 있을까요?
예전영상이라 질문드리기 좀 조심스럽지만.. public int stageIndex; public int health; public PlayerMove player; public GameObject[] Stages; public void NextStage() { //스테이지 변환 if(stageIndex < Stages.Length-1){ Stages[stageIndex].SetActive(false); stageIndex++; Stages[stageIndex].SetActive(true); PlayerReposition(); } else{ //클리어 Debug.Log("클"); } totalEnemy += stageEnemy; stageEnemy=0; } 영상에 나온데로 짠거 같은데 골인점에 닿았을때 스테이지가 넘어가질 않고 바로 else 구문으로 넘어가네요... 혹시 왜 그런지 여쭐 수 있을까요?
골드메탈님! 영상을 참고하며 독자적으로 게임을 만들어보고 있는데요, 마땅히 질문할 곳이 없어서 그나마 여기 올려봅니다ㅠㅠ 골드메탈님처럼 finish 깃발에 닿으면 다음 스테이지로 넘어가게 했는데요.. 깃발에 닿으면 가끔 onTriggerEnter2D가 두 번 실행됩니다. 디버그해보니 충돌이 두 번 된걸로 뜨더라구요. 오브젝트가 두 개 겹쳐있는것도 아니고 콜라이더가 여러개인것도 아닌데 문제가 뭘까요?ㅠㅠ
물리적인 움직임에 의해 그럴 수 있습니다. 정확한 계씬을 위해서 깃발에도 Rigidbody2D 달아주시고 대신 움직이지 않으니까 Type을 Static으로 설정해주세요. 그래도 두 번 실행된다면 bool isTouch 같은 변수 추가해서 최초 닿을 때 isTouch = true; 해두고 위에는 if (isTouch) return; 놓아서 두번 모두 실행되지 않게 막으실 수 있습니다.
안녕하세요 골드메탈님 질문이 있어서 댓글을 남깁니다. 혹시 플레이어의 health와 게임매니저의 충돌에서의 health를 둘 다 -- 하는 이유가 있는지요? 제가 플레이어 부분을 지워 봤는데 실행 시 게임매니저 health 감소가 안 되더라고요 플레이어 부분의 gamemanger.health 감소와 게임매니저의 health 감소의 의미가 뭔지 궁금합니다.
피격판정은 되는데 피격 에니메이션이랑 불투명해지는게 적용이 되지 않습니다. 근데 또 죽는모션은 되고요. 피격시 Index was outside the bounds of the array.라고 뜨는데 혹시 짐작가시는게 있을까요? +위에 문제들은 해결이 됐는데 가시 판정을 따로 만들어 놓으니 피격후 잠깐동안 무적이되는 코드가 안먹히는 건지 불투명해져도 계속 피격당합니다. 그냥 기존의 적에게 닿았을때 판정이 적혀있는 코드 밑에 else if(collision.gameObject.tag == "Spike") //가시판정 { OnDamaged(collision.transform.position); } 이라 해놓았는데 무적이 적용이 안되요. ++알고보니까 PlayerDamaged랑 새로만든 Spike 태그끼리 상호작용이 안되게 해놓으면 되는 거였네요. 늘 좋은 강의 감사합니다.
골드메탈님 질문 있습니다! 1. 몬스터를 밞을때 SetActvie(false) 보다 Destroy를 쓰는 것이 더 메모리 관리에 효율적이지 않나요? SetActive는 비활성화만 시키는 것이니 그대로 남아있어서 계속 메모리를 잡아먹는다고 알고 있어서 여쭤봅니다! 2. void OnAttack(Transform enemy) { //Point //Enemy Die EnemyMove enemyMove = enemy.GetComponent(); enemyMove.OnDamaged(); } 이 부분이 도저히 생각해도 잘 이해가 안갑니다.. ㅠㅠ 저 앞에 (Transform enemy)가 왜 붙는지 모르겠고 아래쪽에는 굳이 enemyMove라는 변수를 추가했는지 모르겠고 컴포넌트를 가져올거면 앞쪽에 Awake 함수에 넣어야하지 않나 싶어서 질문드립니다!
1. 한두번 정도만 사용하는 게임오브젝트는 Destory를 써도 무방합니다. 단 한 장면에 여러 번 등장하는 오브젝트는 다시 재사용을 위해 파괴하지 않고 비활성화를 해두고 다시 활성화하여 사용하는 경우가 많기 때문에 그 연습이라고 보시면 되겠습니다. (Destroy를 많이 사용하면 파편화된 메모리가 쌓이게 되어 GC 가비지컬렉션이 실행됩니다.) 2. 플레이어 -> 몬스터에게 공격을 하므로 밟힘을 당한 몬스터에게 데미지 함수를 호출해주어야 합니다. 하지만 스크립트는 플레이어기 때문에 몬스터까지 접근하기 위해서 Transform enemy 매개변수를 받는 것입니다. 만약 이 스크립트의 Awake에서 GetComponent()를 한다면 그 값은 Null (공허)가 될 것입니다. 플레이어가 Enemy 스크립트를 컴포넌트로 갖고 있ㅈ ㅣ않기 때문이죠. 몬스터가 가진 Enemy 스크립트 컴포넌트로 접근하려고 하기 위해서 몬스터의 Transform에다가 .GetComponent();를 하는 것이니 참고 바랍니다.
골드메탈님 강좌로 유니티 공부중인데 정말 이해가 잘 됩니다. 강좌 만들어주셔서 정말 감사합니다!ㅠㅠ 그리고 한가지 질문이 있는데요, GamaManager를 만들고 PlayerMove에 있는 Game Manager 칸에 끌어놓으려고 해도 들어가질 않습니다ㅠㅠ 왜 그런 걸까요?? ㅠㅠ 이것때문에 진행을 못 하고 있습니다ㅠㅠ 알려주시면 감사하겠습니다! 강좌 정말 잘 보고 있어요!!
골드메탈님, 항상 유익하고 즐거운 강의 감사합니다! 다만 강의를 따라 하던 도중, 약 33:00분에서 하고 있는 stageIndex 배열 부분에서 문제가 있어서 "The referenced script (Unknown) on this Behaviour is missing" 이라는 메세지가 출력되는데 이 부분은 어떻게 하면 좋을까요?
몹을 밟았는데 아무 변화 없는 문제. 몹이 죽고나서 한 없이 떨어지는 문제. 에너지 달아서 죽으면 멈추는 문제. UI까지 하고 Retry버튼 안나오면서 멈추는 문제. 가시 밟으면 오류나면서 멈추는 문제. 마지막 스테이지 클리어시 Retry버튼 안뜨면서 멈추는 오류문제. 이게 지금까지 따라하면서 나온 오류들인데 시간은 좀 걸렸지만 댓글이랑 구글검색해가면서 어찌어찌 다 해결했네요. 아직 이해하면서 따라하는 것은 아니지만 이해되고 이렇게 저렇게 혼자서 코드짜면서 해볼 날이 올거라고 생각하면서 따라하고 있어요. 그래도 다행인 것이 어릴 때는 정말 이렇게 해라 저렇게 해라 해도 무슨 뜻인지 전혀 감도 안와서 그냥 막막하고 어렵게만 느껴졌는데 골드메탈 선생님의 영상의 내용이 좋아서 그런지 지금은 막막한 느낌은 전혀 없고 할 수 있겠다는 생각이 많이 드네요. 맘이 앞서서 슈팅게임부분을 먼저 따라하다가 뭔가 빼먹는 기분이 들어서 기초B강의 처음부터 따라하면서 정주행하고 있어요.ㅎㅎㅎ 글이 길었네요. 그래서 드리고 싶은 말은 겁나서 코드 한 마디 못 쓰던 저같은 사람을 이렇게까지 자신감이 생길 수 있도록 좋은 내용으로 교육자료 올려주시는 것에 너무 감사하다는 것입니다. 하루빨리 게임을 하나 만들어서 골드메탈선생님께도 보여드리고 싶네요.
골드메탈님 덕에 2d플랫폼 공부 너무 복잡하지 않게 잘 배우고있습니다. 게임개발쪽 학과 학생이라 골드메탈님 자료 보며 공부중인데 깃허브 사용법 공부도 병행중이라 하나씩 업데이트하면서 깃허브에 올려도 괜찮을까요? C#공부랑 유니티 전부 깃허브에 매일매일 기록중이라서요 그리고 어플빌드도 공부중이라 결과물들 빌드해서 테스트하고 다녀도 괜찮을까요?
08:19초 OnDamaged 함수 내 Invoke("DeActive", 5)가 작동하지 않습니다. DeActive 함수 호출 자체가 아예 안되네요. 그런데 capsuleCollider.enabled = false 부분을 주석 처리 하니 또 Invoke가 정상적으로 작동합니다. 콜라이더를 끄는 것과 Invoke와 무슨 상관관계가 있나요? 영상을 보니 골메님도 DeActive함수가 호출이 안되는 것 같습니다.
Invoke가 작동이 안되는 경우도 있더군요 이럴때는 코루틴을 사용하시면 됩니다. 코루틴 사용 방법은 아래 링크로 드리겠습니다. m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pxkey&logNo=221296053953
강의 영상 잘 보고 있습니다. 질문이 있어서 드릴려고 합니다. 31:30초에서 VelocityZero()함수를 만드는 건 이해가 되는데요. GameManager.cs 안에 PlayerReposition 함수 안에다가 player.rigid.velocity=~; 이렇게 하는 건 오류가 뜨는데 정확한 이유를 알 수 있을까요? PlayerMove가 클래스니까 안에서 선언해준 멤버 변수 rigid도 사용할 수 있는 게 아닌가요? 오류를 보니까 보호 수준 때문에 액세스할 수 없다고 하는데 public과 private의 차이 때문에 그런 건가요?
24:47에 있는 capsuleCollider에서 자꾸 Assets\Script\PlayerMove.cs(147,9): error CS0103: The name 'capsuleCollider' does not exist in the current context 이 오류가 뜨네요. 이런 경우에는 어떻게 해야 하나요?
골드메탈님 지금까지 열심히 공부하지만 모르는게 있어서 처음 댓글 달아봅니다! 다음 스테이지로 넘어가는 로직을 만들 때 public GameObject[ ] stages; 라고 하셨는데 [ ]의 의미는 뭔가요? 그리고 스테이지가 다음으로 넘어갈 때 if(stageIndex < Stages.Length-1)이라는 조건을 걸어 주셨는데 이 부분도 이해가 잘 안되네요... Length가 문자열 개수를 알려주는 것 아니였나요? 근데 Stages.Length-1는 왜 쓰이는지 모르겠어요 ㅠㅠ
안녕하세요 골드메탈님 항상 영상 잘보고 따라가고있습니다! 다름이아니라 다른 소리들은 잘 재생이 되는데, DIE 사운드만 잘 나지않습니다. 그래서 몇번 테스트해본 결과, 번지점프해서 나오는 사운드는 항상 잘 나는데 가시에 부딪히거나 몬스터에 부딪힐경우 이 (DAMAGED)소리들때문에 소리가 묻히거나 덮어씌워져서 잘 나지않는 듯합니다. 이럴경우 DIE소리를 조금있다가라도 나게 하고 싶으면 어떻게 처리해야 좋을지요..?
저도 가시나 몬스터에 부딪혀서 죽으면 death 사운드가 안나오고 damaged 사운드만나와서 잠시 고민했는데 그냥 damaged 사운드가 나오는 조건을 체력이 2 이상일때만 나오도록 if 조건문 걸어주면 되요 그리고 sound 함수가 damaged 함수보다 위에 있어야됩니다 if (hp>=2) sound("damaged"); damaged(~~); 이런식으로요 반대로 damaged 함수를 위에 적으면 체력이 2일때 데미지사운드가 안나올거에요 아마두
골드메탈님 몬스터 밟기를 구현하는 데 죽질 않고 몬스터 위에 올라타버립니다. 공중에 떴다는 판정인지 캐릭터가 버둥거립니다. 이것을 해결하려고 collider를 box로도 설정해보고, capsule 크기도 다시 설정해봐도 달라지는 게 없네요. 파일이나 개체의 이름 설정을 제대로 하지 못해서 그런 건 아닌 것 같습니다.
좋은 강의들 감사합니다 지금까지 기초채널 처음부터 2d플랫포머 완성하기 강의 까지 재밌었고 너무 감사합니다. 지금까지 하면서 이해 안되는 것이 있는데 알려주세요 ㅠㅠ 감사합니다 . 1. if (stageIndex < Stages.Length -1) 이 코드를 사용 한이유가 무엇이고 , Stages.Length는 무엇을 의미하는지 궁금합니다 Stages.Length는 어디에 위치하는지 궁금합니다. 2. SceneManager.LoadScene(0); 어떤것이 0번째 인가요? Scene 자체가 1개 밖에없어서 0 인건가요? 3. Default Contact Offset : 충돌 여백 로 알고 있는데 체크할 때 와 체크 하지 않을 때의 차이점이 궁금합니다. 4. Input.GetButtonDown("Jump")&& !anim.GetBool("isJump")) 무슨 뜻 5. if (rigid.velocity.x > maxSpeed) //Max Speed rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);//velocity : 리지드바디의 현재 속도 else if (rigid.velocity.x < maxSpeed * (-1)) rigid.velocity = new Vector2(maxSpeed * (-1), rigid.velocity.y);//velocity : 리지드바디의 현재 속도 rigid.velocity.x와 rigid.velocity.y의 값을 알고 싶습니다. 어디서 확인 할 수 있나요? 6. rigid.position은 무슨 뜻인가요? 8.Physics2D은 어떤 상황일 때 사용하나요? 9. //Atack if (rigid.velocity.y < 0 && transform.position.y > collision.transform.position.y) { OnAttack(collision.transform); } if조건식만 해석좀 해주세요 10. nextMove = Random.Range(-1, 2); //Range(): 최소(-1)~최대(2) 범위의 랜덤 수 생성 If (nextMove != 0 ) // 움직이지 않고 서 있을 때 spriteRenderer.flipX = nextMove == 1; //true = 1 =spriteRender flip x축 체크 여기서 flipX가 nextMove가 같을 때 1(true)이 되면 어떻게 된다는 건가요? 1이 true인건 알고 있는 데 이해가 안되네요 ㅠㅠ 11. UIpoint.text = (totalPoint + stagePoint).ToString(); ToString()이 무엇인가요?
1. 다음 스테이지가 있으면 넘어가기 위한 조건입니다. Stages는 배열 변수로 선언하였고 Length는 배열 길이를 뜻합니다. 2. File > Build Setting에 가면 Scene Index가 숫자로 표기되어 있습니다. 3. 체크가 아니고 수치만 조절합니다. 수치가 낮을수록 콜라이더 끼리 닿아있는 거리가 좁아집니다 (더 미세해짐) 4. 점프버튼 누른 상태 + 현재 점프 애니메이션 상태가 아닐 때 5. 리지드바디의 속도값입니다. 인스펙터 창에선 표시되지 않으며 Debug.Log()로 확인해야 합니다. 6. 리지드바디의 위치를 뜻합니다. 8. 2D 물리효과의 함수를 사용할 때 필요합니다. 9. 내려오고 있는 속도 + 플레이어가 충돌한 몬스터보다 위에 있을 때 10. =는 대입연산입니다. 비교연산은 == 이며 mextMove와 1을 비교하고 그 결과 bool값을 flipX에 넣는 겁니다. 11. int 혹은 float 형태의 값을 문자열 String 형태로 바꿔주는 함수입니다. - 전반적으로 질문들의 형태가 유니티 기초를 건너뛴 모습니다. 가급적 B2~ BE1 강좌를 보시면서 유니티 기초를 이해하시는 것을 추천드립니다.
안녕하세요 하나 질문이 있는데 캐릭터가 스테이지3 피니쉬 깃발까지 가면 NullReferenceException: Object reference not set to an instance of an object GameManager.NextStage () (at Assets/Scripts/GameManager.cs:45) PlayerMove.OnTriggerEnter2D (UnityEngine.Collider2D collision) (at Assets/Scripts/PlayerMove.cs:109) 이런 오류가 뜨는데 대체 뭐가 문제일까요ㅠㅠ
GameManager의 45번째 줄에서 사용한 변수가 비어있다는 이야기입니다. 강좌 내용대로라면 Stages에 담은 3개 스테이지 이후가 없으므로 3스테이지의 깃발을 터치하면 아예 게임을 끝내거나 4단계 스테이지를 직접 제작하셔서 Stages에 추가하는 방법으로 해결하실 수 있습니다.
void OnAttack(Transform enemy) { EnemyMove enemyMove = enemy.GetComponent(); enemyMove.OnDamaged(); } 이부분이 이해가 가질 않습니다. 평소랑 GetComponent 를 다르게 쓰는 것 같아서 왜 이렇게 쓰는지 알려주실 수 있을까요? 왜 그냥 GetComponent를 사용하지 않았는지. Transform이 왜 필요한지 궁금합니다. 제가 알기로 GetComponent앞에 뭔가 붙었을 때는 다른 오브젝트에서 컴포넌트 가져오는 경우인 걸로 알고 있습니다. EnemyMove도 컴포넌트 인가요? C#script 컴포넌트인가요? 그게 맞다면 왜 그 스크립트를 collision.Transform에서 추출하나요? 질문이 좀 두서없어서 죄송합니다. 혼자 여러번 고민해 보았지만 답이 나오지 않아 답답한 마음에 여쭈어 봅니다.
우리가 만든 C# 스크립트를 게임 오브젝트에 넣으면 그게 하나의 컴포넌트가 되는 것입니다. 인스펙터 상에서 보이는 컴포넌트들은 모두 GetComponent로 가지고 올 수 있는 것이죠. collosion.transform 을 가져온 이유는 transform이 위치,회전,크기 값을 가지고 있으면서도 GetComponent를 사용할 수 있는 핵심 컴포넌트기 때문입니다. 꼭 이걸 따라하실 필요는 없지만 보통은 이런 식으로 구현한다고만 참고하시면 좋겠습니다.
33:33 에 PlayerMove.cs(155,15): error CS1061: 'Rigidbody2D' does not contain a definition for 'Velocity' and no accessible extension method 'Velocity' accepting a first argument of type 'Rigidbody2D' could be found (are you missing a using directive or an assembly reference?) 라고 뜨는데요
자체 해결했습니다.. 게임매니저를 스테이지마다 하나씩 넣어놨었네요 (원글 : 1스테이지에서는 정상적으로 출력되던 점수 텍스트가 2스테이지부터는 올라가지않습니다! Debug.Log(stagePoint);를 해보니 2스테이지에 돌입하면 stagePoint가 0으로 고정되고 아이템을 습득해도 아무런 반응이 없는데 혹 짐작가는 바가 있으신가요?)
항상 좋은 영상 감사합니다 질문이 있는데 25:00 부근에 GameManager의 인스펙터에서 Player 오브젝트를 끌어놓았는데 게임실행 버튼을 누르면 원래 상태 (None)으로 초기화 됩니다. Player에다가 GameManager을 끌어놓는건 이상없는데 왜 이런지 아실까요 ㅜ
안녕하세요 항상 유익한 강의 감사합니다!!! 질문이 있는데요... 강의 따라서 다 해서 아무문제 없었는데요. 제 캐릭터로 새로운 프로젝트에다가 스크립트들을 복사해서 똑같이 썼어요! 근데 플레이어가 움직일때 조금 한방향으로 가다가 갑자기 자동으로 멈춰요. 다른방향으로 키보드로 한번했다가 다시 원래 방향을 눌러야만 다시 움직여요 하지만 다시 조금 움직인 후에 다시 멈춰요...:(
안녕하세요 골드매탈님 볼트 관련된 영상을 보고서 궁금한게 있어서 물어보는데요 이 영상에서 타일맵으로 동전을 배열해서 먹는 것이 나오는데 볼트를 이용해서 플레이어가 동전 닿게하면 플레이어가 닿은 동전만 사라지는 것이 아니라 타일맵에 있던 모든 동전이 다 사라져요 ㅠㅠ 제가 봤을 때는 마지막에 게임오브젝트 destroy-self 부분에서 잘못된 것 같은데 어떻게하면 타일맵에서 닿은 동전만 사라질까요??
26:13초 죽게되면 else부분에 들어갔을때 OnDie를 불러오는 과정중에 멈추는거 같습니다. Debug부분에 죽었다는 부분을 먼저 올리고 이후 OnDie를 실행시 죽었다는 문구가 발생하지만 원래대로 돌려두면 죽었다는 문구가 발생하지가 않습니다. NullReferenceException: Object reference not set to an instance of an object GameManager.HealthDown () (at Assets/scripts/GameManager.cs:30) GameManager.OnTriggerEnter2D (UnityEngine.Collider2D collision) (at Assets/scripts/GameManager.cs:40) 바닥에 떨어지게 되면 저렇게 나오는데 머가 문제인가요. EnemyMove에서 OnDamage()에 있는 4줄을 때왔을때 PlayerMove에 CapsuleCollider2D capsuleCollider;와 capsuleCollider = GetComponent(); 이 두문장이 없다고 에러가 발생해서 이걸 추가해도 마지막 목슴이 0개되면 자꾸 저 에러가 발생하네요 OnDie()는 이렇게 작성이 되어있습니다. public void OnDie(){ spriteRenderer.color = new Color(1, 1, 1, 0.4f); spriteRenderer.flipY = true; capsuleCollider.enabled = false; rigid.AddForce(Vector2.up * 5, ForceMode2D.Impulse); }
그래픽 강좌부터 유니티 기초강좌 처음부터 지금까지 정말 잘 보고 있습니다! 그런데 제가 이번 강좌에서 몬스터를 밟아 죽이는 부분을 작성하고, 점프를 해서 몬스터의 머리를 밟는것이 아닌 몬스터랑 몸통박치기를 하면 플레이어가 피해를 안받고 오히려 몬스터가 죽는 경우가 있습니다. 분명 소스코드는 똑같이 작성했는데 어디가 잘못된건지 감이 안오네요ㅠㅠ