일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 입출력 관리자
- 원형 연결 구조 연결된 큐
- 회전 및 자리 이동 연산
- 문자형 배열
- r-value참조자
- 알고리즘 조건
- 범위 기반 for문
- string유형
- 백준 파이썬
- 괄호 검사 프로그램
- C언어 스택 연산
- 값/참조/주소에 의한 전달
- 유형 변환
- auto 키워드
- getline()함수
- c언어 괄호검사
- 운영체제 기능
- 주기억장치
- 네트워크 결합
- C언어 계산기 프로그램
- 프로그래머스 배열만들기4
- LAN의 분류
- IPv4 주소체계
- 프로그래머스 푸드 파이트 대회
- const화
- 논리 연산
- C언어 덱
- const l-value참조자
- l-value참조자
- 문제해결 단계
- Today
- Total
chyam
[unity] - 물리 퍼즐게임 만들기 ( 수박게임 ) 본문
골드메탈님 영상으로 배운것들 정리하기!
먼저 카메라 비율을 변경하였다.
Aspect Ratio로 9대19 비율로 만들어주었다.
저 동그란 공은 처음에 자유낙하를 하면 안되므로, rigidbody에서 simulated에 체크를 해제하였다. 그리고 콜라이더 반지름을 크기에 맞게 조금 늘렸다.
이런 식으로 만들때, 바닥과 벽은 충돌되어야하고, 그대로 멈춰있어야한다.
충돌하기 위해는 콜라이더가필요하고, transform 컴포넌트의 전달과 콜라이더와의 연결을 위해서 rigidbody를 추가한다.
이 때, 벽과 바닥은 고정되어있어야 하므로, body type을 dynamic이 아닌 static으로 바꾼다.
빈 오브젝트를 생성하여 배경,바닥,벽, 라인을 그룹으로 묶어준다.
라인은 box 콜라이더도 추가해주었고, 충돌하면 안되므로 is Trigger에 체크도 해줬다.
저 동그란 공에 스크립트를 추가해준다.
--스크립트--
public bool isDrag;
Rigidbody2D rigid;
private void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
먼저 마우스를 누르고있는지 아닌지를 isDrag로 표현한다.
-Update문
if (isDrag){
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
float leftBorder = -4.2f + transform.localScale.x / 2f;
float rightBorder = 4.2f - transform.localScale.x / 2f;
if(mousePos.x < leftBorder)
{
mousePos.x = leftBorder;
}
else if(mousePos.x > rightBorder)
{
mousePos.x = rightBorder;
}
mousePos.y = 8;
mousePos.z = 0;
transform.position =Vector3.Lerp(transform.position, mousePos,0.2f);
}
드래그 중일때, 마우스가 움직이는 좌우 방향에 따라서 공이 움직이게 해야한다.
mousePos는 마우스 위치를나타낸다.
Camera.main.ScreenToWorldPoint에서 main까지는 메인카메라에 접근가능한것이고, Screen부분은 스크린 좌표를 월드좌표로 변환한것이다. 마우스 커서는 스크린좌표계에서만 돌아다닌다.
Input.mousePosition은 마우스 위치이다.
leftBorder은 왼쪽경계부분을 말하는데, -4.2를 한 이유는 벽의 x위치가 -4.7이고, 크기가 1이니까 반지름인 0.5를 더해준것이다. 그리고 공의 가로크에서 2를 나눈값을 더해준다. 이것도 공의 가운데 중심이라서 2를 나눈것같다.
오른쪽 경계는 4.2에서 -를 해주어야한다. +를하면 화면 밖으로 나가지기 때문이다.
그리고 마우스의 x값이 경계부분을 넘게되면 경계값을 가지게 고정한다.
y위치를 8로 고정시키고, z위치를 0으로 고정시킨다. ( 카메라 제외 다 0임 )
transform으로 위치는 mousePos로 해주는데, 부드럽게 이동하기위해서 Lerp를 사용해준다.
public void Drag()
{
isDrag = true;
}
public void Drop()
{
isDrag= false;
rigid.simulated = true; //끈거 다시 키기
}
Drag함수는 isDrag가 참이게해준다.
Drop함수는 isDrag가 거짓이게하면서, simulate를 true로 하여 자유낙하 하도록한다.
이것은 Event Trigger에서 실행할수있게 한다.
Event Trigger은 각종 액션들에 대한 이벤트 관리 컴포넌트로,
이런것들이있다. 이중에서 pointerDown은 마우스 누르는것, Up은 뗀것이다.
화면 전체를 버튼으로 쓰기 위해서 image UI를 하나 생성하고 TouchPad라는 이름을 붙인다.
크기는 Alt+Shift를 통해 꽉채우도록한다.
위 사진처럼 추가해주면, 마우스 클릭했을때 Drag가 실행되어 움직일수있고,
뗏을때 공이 떨어지게된다.
'unity' 카테고리의 다른 글
[unity] - 물리 퍼즐 게임 3 ( 수박 게임 ) (0) | 2024.08.15 |
---|---|
[unity] - 물리 퍼즐게임 만들기-2 ( 수박게임 ) (0) | 2024.08.13 |
[unity]- 기초 입력 함수, 목표지점 이동,deltaTime (0) | 2024.07.09 |
[unity]- 2d 탑다운 [ 설정 창 ] (0) | 2024.07.05 |
[unity] - 2d 탑다운 [ 대화창,초상화,타이핑 이펙트 ] (0) | 2024.07.04 |