개?발/Unity 혼공 10

유니티 3D Tilemap 위에서 플레이어 한 칸씩 움직이기

시작위치에 서있는 플레이어를 X 축 + 1 방향으로 위와같이 움직이도록 하는 작업을 한번의 입력으로 이뤄지도록 할 필요가 있다.그래서 이전에 현재 서있는 타일의 좌표 및 해당 좌표를 통해 얻어낼 수 있는 타일의 중앙 값을 이용하기로 했다. 생각한 과정은 아래와 같다. 1. (0,0)에서 오른쪽 방향이면 +1, 왼쪽이면 -1을 더한 값을 변수에 저장한다.2. 만약 오른쪽으로 이동했다면 (1, 0)이 저장된다.3. 저장된 (1, 0)을 매개변수로 하여 (1, 0) 타일의 중앙 값을 알아낸다.4. 알아낸 중앙 값으로 플레이어를 이동한다. void PlayerMove(){ if(Input.GetButtonDown("Horizontal") || Input.GetButtonDown("Vertical")..

유니티 Tilemap 좌표 값 및 중앙 위치 구하기

캡슐이 플레이어고 아래 타일을 한칸 씩 움직이게 하려할 때 좌표를 구해야할 것이다.알아보니 3D에서도 패키지만 설치하면 2D와 동일하게 Tilemap을 사용할 수 있어서 위와 같이 타일을 임시로 생성했다.[참고링크] [Unity] 3D 맵 제작 (2D 타일맵을 이용하여 제작하기)궁금증이 들었던 부분 2D에서 처음 타일맵을 배웠을때 내가 오브젝트를 하나하나 만들 필요가 있던게 아니라 그림그리듯 배치를 해주면 됐어서 좋았는데 이걸 3D 맵 배치에서도 사용할 수 있을milkyquartz.tistory.com 이제 타일맵 오브젝트로부터 타일의 각 위치를 먼저 알아야한다. 그래야 이동할 다음칸이나 목적지를 정할 수 있기 때문이다. 처음 그림에 좌표를 빗대어 보면 이렇게 표현할 수 있다. 일단 여기서 알아두어야할 ..

몰라서 했던 삽질(싱글톤, 스크립트 나누기)

유니티 공부를 위해 자체적으로 게임을 만들며 기능을 하나씩 구현해가던 중(공격, 차징공격 까지) 플레이어 스크립트가 너무 복잡하다는 것을 깨달았다. 개발자 친구와의 대화중에 기능별로 세분화해서 스크립트를 분리하는 것이 좋다는 말에 무작정 다음날 플레이어의 상호작용, 공격을 무작정 분리하기 시작했다. 명확한 계획없이 진행하다보니 근거리공격, 원거리공격을 나누어서 진행하려다 막상 나누고보니 스크립트의 길이가 길지 않아 다시 합친다거나 하는 불필요한 행위들이 있었으나 그건 그다지 큰 일은 아니었다. 이전 백엔드를 공부할 때 다른 class 파일의 변수나 함수에 접근하는 방법은 크게 어렵지 않았다. (물론 교육을 듣고 있었던지라 모르는게 있으면 강사님께 여쭤봤지만) 하지만 지금은 오로지 구글링만 있을 뿐. 맨처..

절벽감지 및 경사로 예외상황

적 개체가 자동(랜덤)으로 움직일 수 있게 구현했지만 절벽이 있을 경우 감지하고 움직임을 멈출 수 있도록 구현했다. 방법은 위와 같이 cyan색의 ray를 진행방향 쪽으로 생성하고 본 오브젝트(적 개체)가 지면에 닿아 있을 때(점프 상황을 고려) ray에 지면이 감지되지 않으면 vector.x의 값을 0으로 설정했다. RaycastHit2D cliffCheck = Physics2D.Raycast(new Vector2(gameObject.transform.position.x + (cliffCheckStartSpot * face), gameObject.transform.position.y), Vector2.down, cliffCheckDistance, LayerMask.GetMask("groundMask")..

지면 점프(위 지형으로 점프하기)

그림과 같이 지형이 존재할 때 플레이어 오브젝트가 지형을 올라가는데 1.지형의 아래에서 점프할 경우 지형에 부딪히지 않고 위로 올라갈 수 있도록 지형의 Inspector에서 Platform Effector 2D 컴포넌트를 추가하고 Use One Way를 체크한다. (Collider창에서 Used by Effector를 체크해야 활성화 된다.) Surface Arc를 조절하여 유효한 충돌이 일어날 각도를 맞춰준다. 이번에는 160도로 설정했다. (180으로 설정하면 측면에서 접근했을 때 충돌이 일어나 지면을 뚫지 못한다.) 문제점. 공중에 떠있는 지형에서 점프키를 지속적으로 누르고 있을 경우 발생한다. 먼저 일반적인 점프의 높이는 다음과 같다. 지면이 감지되지 않으면 점프키가 유효하지 않다. 하지만 공중에..

공격(HitBox)좌우 반전(position, localPosition)

플레이어 근접공격 및 적 상호작용 목표 : 까만 캡슐을 플레이어, 파란 원을 적이라고 가정했을 경우 플레이어가 근접공격을 했을 때 적의 체력이 감소하도록 구현하기 코드 구조는 위와 같이 구성하였다. 플레이어와 적 개체간 yun784.tistory.com 이전에 이어서 근접공격 구현 시 -x방향으로 입력시 왼쪽과 같이, +x방향으로 입력시 오른쪽과 같이 입력한 방향에 따라 공격을 감지하는 박스의 위치가 변경되게끔 구현하고자 했다. if((atkPos.position.x 0 && inputX == -1)){ atkPos.position = new Vector3(-atkPos.position.x, atkPos.position.y, a..

벽 미끄러짐 및 지상 감지 방식(Collider 2D,platform effector 2D, side friction)

문제점 : 벽 오브젝트와 충돌 시 벽이 존재하는 방향으로 입력을 지속하면 플레이어 오브젝트가 벽 오브젝트와 붙어 중력의 영향을 받지 않고 붙어버리는 현상이 발생. 단순히 ray를 이용해 벽이 감지되면 friction항목을 0으로 만들고 감지되지 않으면 원래 값으로 복구할 생각이었으나 friction항목은 Physics material 파일을 따로 생성후 collider inspector에 삽입하는 방식이라 직접적인 접근이 불가했다. [유니티 강좌] 2D RPG 게임 만들기 - 8 / 벽에 붙는 현상 안녕하세요. 오랜만에 포스팅입니다. 그동안 댓글로 응원해주신 분들 모두 감사드리고 죄송합니다! 현재까지 진행된 프로젝트 압축 파일은 구글 드라이브에 올려놨습니다. 혹시 막히시면 참고 hoil2.tistory...

플레이어 근접공격 및 적 상호작용

목표 : 까만 캡슐을 플레이어, 파란 원을 적이라고 가정했을 경우 플레이어가 근접공격을 했을 때 적의 체력이 감소하도록 구현하기 코드 구조는 위와 같이 구성하였다. 플레이어와 적 개체간 직접적인 상호작용으로 구현할 수 있으나 이후 적 개체 추가 및 방어력과 같은 수치를 적용하는 등 사후 작업을 위해 게임매니저를 거칠 수 있도록 했다. Player 1.근접공격 구현 void Attack(){ if(Input.GetKeyDown("z") && atkCurTime > atkMaxTime){ AttackingAnime(); //공격 애니메이션 Collider2D[] collider2Ds = Physics2D.OverlapBoxAll(atkPos.position, atkBoxSize, 0); //OverlapBo..

Unity 박스 움직임 및 파괴 (like.슈퍼마리오)

구현 목표: 회색의 플레이어 오브젝트가 점프하여 빨간 상자를 건드렸을 때 상자가 튀어오르는 듯한 움직임을 보인 뒤 동전 오브젝트를 생성 후 파괴되도록 함 1.플레이어 오브젝트가 빨간 상자를 건드리면 public CoinBox coinBox; private void OnCollisionEnter2D(Collision2D other) { if(other.gameObject.name == "CoinBox"){ coinBox.isTouch = true; } } 위의 코드에 의해 coinBox의 isTouch를 true로 변경한다. 2-1. 방법 1 public class CoinBox : MonoBehaviour { public bool isTouch; public float upPower; Rigidbody2..

Unity 2D 경사로 미끄러짐

문제 : 플랫포머 기반 게임을 만들때 계단이 아닌 위와 같은 경사로를 구현할 때 플레이어(회색)이 경사로에서 중력의 영향을 받아 1.올라갈 때 느린속도로 올라감. 반대로 내려올 때 가속을 받아 빠른 속도로 내려옴 2.경사로에서 입력이 없을 시(정지 상황을 유도) 중력에 이끌려 경사로 아래로 내려감. 3.점프(addforc.impulse)를 입력시 가속 상황에 더 멀리 점프하게 됨.(의도는 평지와 같은 힘만큼만 점프하길 원함) 참고 영상 위의 해결 방법은 다음과 같다. 1.플레이어가 경사로를 접했을 때 ray를 이용하여 해당 경사로의 정보를 저장한다. 2.ray와 맞다은 경사로로부터 수직의 법선을 그린다. 3.해당 법선과 (0,1)좌표와 아래로 선을 그어 맞닿은 지점의 각도를 저장한다. 4.해당 각도를 이..