일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- auto 키워드
- 원형 연결 구조 연결된 큐
- r-value참조자
- 입출력 관리자
- LAN의 분류
- l-value참조자
- 문제해결 단계
- 회전 및 자리 이동 연산
- 범위 기반 for문
- const화
- 괄호 검사 프로그램
- getline()함수
- 운영체제 기능
- C언어 스택 연산
- C언어 계산기 프로그램
- 주기억장치
- 네트워크 결합
- string유형
- c언어 괄호검사
- 알고리즘 조건
- C언어 덱
- 프로그래머스 배열만들기4
- 프로그래머스 푸드 파이트 대회
- 문자형 배열
- 값/참조/주소에 의한 전달
- 백준 파이썬
- IPv4 주소체계
- const l-value참조자
- 논리 연산
- 유형 변환
- Today
- Total
chyam
[unity] - 물리 퍼즐 게임 3 ( 수박 게임 ) 본문
공들이 같은 레벨일 때 합쳐져서 다음 레벨로 변하게 만들 것이다.
먼저 동글 프리펩의 태그를 Dongle로 설정해 준다.
public GameManager manager;
public ParticleSystem effect;
public bool isMerge;
CircleCollider2D circle;
private void Awake(){
circle = GetComponent<CircleCollider2D>();
}
isMerge는 합쳐지고 있는중인지 여부를 나타낸다.
private void OnCollisionStay2D(Collision2D collision)
{
if (collision.gameObject.tag=="Dongle")
{
Dongle other = collision.gameObject.GetComponent<Dongle>();
if (level == other.level && !isMerge && !other.isMerge && level<7)
{
//나와 상대편 위치 가져오기
float meX = transform.position.x;
float meY = transform.position.y;
float otherX = other.transform.position.x;
float otherY = other.transform.position.y;
//1. 내가 아래에 있을 때
//2. 동일한 높이일 때, 내가 오른쪽에 있을 때
if (meY < otherY || (meY == otherY && meX > otherX)) {
//상대방은 숨기기
other.Hide(transform.position);
//나는 레벨업
LevelUp();
}
}
}
}
OnCollisionStay는 A와 B가 닿고 있는 동안 실행된다.
충돌한 물체의 태그가 Dongle일 때 실행된다.
충돌한 물체는 other로 저장한다.
현재 자신의 level과 충돌한 물체의 level이 같고, 둘 다 isMerge가 거짓이고 level이 7보다 작을 때만 합쳐질 수 있다.
자신의 위치와 상대의 위치를 비교한다.
만약 자신이 상대보다 아래에 있거나 동일한 높이일 때, 자신이 오른쪽에 있다면 상대방을 숨기고 레벨업을 하도록 한다.
public void Hide(Vector3 targetPos)
{
isMerge = true;
rigid.simulated= false;
circle.enabled = false;
StartCoroutine(HideRoutine(targetPos));
}
IEnumerator HideRoutine(Vector3 targetPos)
{
int frameCount = 0;
while(frameCount < 20)
{
frameCount++;
transform.position = Vector3.Lerp(transform.position, targetPos, 0.5f);
yield return null;
}
isMerge = false;
gameObject.SetActive(false);
}
Hide는 합쳐지고있는 중에 발생하는것이므로 isMerge를 참으로 해준다.
물리효과들을 다 비활성화 해준다.
코루틴을 통해서 HideRoutine을 실행해준다.
열거형으로 HideRoutine을 적어야한다.
20프레임동안 Lerp를 통해서 물체를 서서히 이동시킨다.
이동시키고 난 뒤에는 isMerge를 false로 만들고, 보이지않게한다.
void LevelUp()
{
isMerge=true;
//물리속도들 제거하기
rigid.velocity = Vector2.zero;
rigid.angularVelocity = 0; //회전 속도?
StartCoroutine(LevelUpRoutine());
}
IEnumerator LevelUpRoutine()
{
yield return new WaitForSeconds(0.2f);
anim.SetInteger("Level", level + 1);
EffectPlay();
yield return new WaitForSeconds(0.3f);
level++;
manager.maxLevel = Mathf.Max(level,manager.maxLevel);
isMerge=false;
}
void EffectPlay() //파티클 위치와 크기 보정
{
effect.transform.position = transform.position;
effect.transform.localScale = transform.localScale;
effect.Play();
}
레벨업 중에는 합쳐지는 중이므로 isMerge를 true로 설정한다.
물리 속도를 제거하기 위해서 velocity를 zero로 설정하고, 회전 속도도 0으로 해준다.
LevelUpRoutine은 열거형으로, 처음에 0.2초 뒤에 실행된다.
레벨+1이 된 애니메이션을 실행하여 레벨업을 표현한다.
EffectPlay는 이펙트 위치를 현재 위치로 설정해주고, 크기도 같게 설정하여 실행되게 해준다.
0.3초 뒤에 level이 증가하게 해주고, 게임메니저에 있는 maxLevel과 지금 level을 비교하여 maxLevel을 설정해주고 isMerge를 false로 만들어준다.
public GameObject effectPrefab;
public Transform effectGroup;
//이펙트 생성
GameObject instantEffectObj = Instantiate(effectPrefab, effectGroup);//클론 생성 .. 뒤에는 부모.
ParticleSystem instantEffect = instantEffectObj.GetComponent<ParticleSystem>();
DonglePrefab과 같이 effect도 프리펩을 저장하고 그룹으로 만들어준다.
Dongle과 같게 입력해주면 자동으로 생성된다.
이펙트를 보면 rotation이 0 0 0일때, 원뿔이 뒤집어진 모양으로 위로 파티클이 퍼지는것을 볼수있다.
그래서 우리가 원하는 사방으로 입자가 퍼지게 하기위해서 x를 -90으로 해주었다.
start Lifetime은 입자의 기본지속 시간으로, 0.5초에서 1초 사이 랜덤한 값으로 해주었다. 원래는 1 이런값이었는데 오른쪽 역삼각형을 눌러서 바꿔주었다.
start speed는 10으로 설정해주었고, Play On Awake는 꺼주었다. 이것은 시작할때 바로 실행되게 하는것인데 이 이펙트는 바로 실행되면 안되기때문이다.
emission : 입자가 퍼지는 타입과 양.
Bursts는 입자가 한번에 퍼지도록 하는것이다.
shape는 여러가지가있는데 circle로 했다.
Rotation의 x값이 지금 90인데, 만약 맨위의 rotation의 x값이 0이면 이것도 0으로 하면 같은 결과가 나오게된다.
아래는 시간에 따른 속도를 제어하는것이다 .
색깔을 지정해주었다. 색을 지정하면 그 사이가 저절로 그라데이션이 된다.
size over lifetime은 시간에 따른 입자의 크기 변화이다. 갈수록 작아지도록 해준다.
texture sheet animation은 입자를 스프라이트로 애니메이팅할수있다.
circle이 제일 부드럽게 되어서 설정하였다. 아래는 circle이고 그 밑은 다른 스프라이틀 적용한것이다.
trail은 입자에 꼬리/리본효과를 추가하는것이다.
위처럼 증가하는것을하면 아래 사진처럼나오고, 감소하는것을하면 스무스하게 나타난다.
'unity' 카테고리의 다른 글
[unity] - 시간 흐름 [ deltaTime ] (0) | 2024.09.09 |
---|---|
[unity] - 물리 퍼즐 게임 4 ( 수박 게임 ) (0) | 2024.08.18 |
[unity] - 물리 퍼즐게임 만들기-2 ( 수박게임 ) (0) | 2024.08.13 |
[unity] - 물리 퍼즐게임 만들기 ( 수박게임 ) (0) | 2024.08.13 |
[unity]- 기초 입력 함수, 목표지점 이동,deltaTime (0) | 2024.07.09 |