게임 개발 일지/유니티 엔진 공부
15. 유니티 2D 게임 제작 - 문제 수정 및 밟기 공격 기능 구현
인텔리킴
2024. 4. 21. 21:01
플레이어 문워크 문제 수정
방향키 왼쪽 오른쪽을 동시에 누르고 한쪽을 떼면 문워크를 하는 문제가 발생함
void Update()
{
//점프
if (Input.GetButton("Jump") && !animator.GetBool("isJumping"))
{
animator.SetBool("isJumping", true);
rigid.AddForce(new Vector2(0, jumpPower), ForceMode2D.Impulse);
}
//정지할 때 속도
if (Input.GetButtonUp("Horizontal"))
{
rigid.velocity = new Vector2((0.5f * rigid.velocity.normalized.x), rigid.velocity.y);
}
//방향 전환
if (Input.GetButton("Horizontal")) {
spriteRenderer.flipX = Input.GetAxisRaw("Horizontal") == -1;
}
//애니메이션 전환
if (Mathf.Abs(rigid.velocity.x) < 0.5f)
{
animator.SetBool("isWalking", false);
}
else
{
animator.SetBool("isWalking", true);
}
}
GetButtonDown이 키입력이 겹치는 구간에서 문제가 생기기 때문에 문제 발생
이동의 GetButtonDown을 Get Button으로 변환해서 문제 해결
몬스터 밟아서 제거 기능 만들기
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Enemy")
{
//밟기 공격 성공
if(transform.position.y > collision.transform.position.y && rigid.velocity.y < 0)
{
onAttack(collision.transform);
}
//데미지 입는 경우
else
{
onDamaged(collision.transform.position);
}
Debug.Log("충돌");
}
}
밟기 공격이 성공하는 경우는 플레이어가 몬스터보다 위에 있을때, 플레이어가 아래로 이동하고 있을때
두 경우를 조건문으로 삽입
공격이 성공했을때의 코드는 충돌한 오브젝트의 트랜스폼 값을 인수로 가지는 함수를 설정해 작성
만약 조건문이 만족하지 않았을 경우에는 플레이어가 데미지를 입도록함
void onAttack(Transform enemy) {
//반발력
rigid.AddForce(Vector2.up *5, ForceMode2D.Impulse);
//적제거
EnemyMove enemyMove = enemy.GetComponent<EnemyMove>();
enemyMove.onDamaged();
}
공격이 성공하면 EnemyMove라는 스크립트에 들어있는 데미지 함수가 실행되도록 함
또한 플레이어 또한 위로 살짝 튀어오르도록 설정
*다른 스크립트의 퍼블릭 함수를 불러오는 것도 GetComponent<>(); 를 이용해 수행
public void onDamaged()
{
//반투명하게
spriteRenderer.color = new Color(1, 1, 1, 0.3f);
//FlipY
spriteRenderer.flipY = true;
//Collider Disabled
col.enabled = false;
//점프하면서 사망
rigid.AddForce(Vector2.up * 5, ForceMode2D.Impulse);
//몬스터 삭제
Invoke("DeActive", 2);
}
적의 스크립트에 함수 onDamaged() 함수 생성
col.enabled : 콜라이더를 활성화하거나 비활성화 하는 메소드
몬스터 삭제는 일정시간 후 실행되어야하기 떄문에 Invoke()를 이용해서 함수로 구현
void DeActive()
{
gameObject.SetActive(false);
}
몬스터가 없어지는 함수 작성
gameObject.SetActive(false) : 현재 오브젝트를 비활성화시킴
아이템 구현
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Coin : MonoBehaviour
{
Collider2D col;
void Start()
{
col = GetComponent<Collider2D>();
}
// Update is called once per frame
void Update()
{
}
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Player")
{
gameObject.SetActive(false);
}
}
}
코인을 휙득하면 사라지는 간단한 코드 작성
void OnTriggerEnter2D(Collider2D collision)
{
//아이템 휙득 코드
if(collision.gameObject.tag == "Item")
{
Debug.Log("아이템 획득");
}
}
플레이어 코드에도 아이템에 반응하는 트리거 함수 작성
다음 시간에 게임 매니져 작성 예정