게임 개발 일지/유니티 엔진 공부

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("아이템 획득");
    }    
}

플레이어 코드에도 아이템에 반응하는 트리거 함수 작성

 

다음 시간에 게임 매니져 작성 예정