Posted in: Unity, 프로젝트 When the Spring comes

17. 플레이어 피격 판정

원래 플레이어 피격 판정이 없었다. 보통 이런 어드벤처 게임은 무적 판정이 있다. 피격 시 잠시 동안 무적 시간을 주고 그 무적 시간을 시각적으로 표현해 주었다.

void Start()
{
    checkHealth = health;
}

void Update()
{
    if(health != checkHealth)
    {
        isUnBeatTime = true;
        StartCoroutine("UnBeatTime");
    }
}
if(!playerStat.isUnBeatTime)
    Attack();

게임이 시작되면 현재 체력을 checkHealth 변수에 대입한다. checkHealth 변수는 Update 함수를 통해 매 프레임마다 체력이 달라졌는지 확인하는 변수이다.

체력이 달라지면 isUnBeatTime 변수가 true가 되고 몬스터 공격 기능 스크립트에서 true일 땐 공격 기능이 안 불리게 하면 된다. 의외로 간단하게 무적 기능을 만들 수 있는데 문제는 어떻게 시각적으로 보여주냐는 것이다.

IEnumerator UnBeatTime()
{
    for(int i = 0; i < unBeatTime*10; ++i)
    {
        if(i%2 == 0)
            spriteRenderer.color = new Color32(255, 255, 255, 90);
        else
            spriteRenderer.color = new Color32(255, 255, 255, 180);

        yield return new WaitForSeconds(0.1f);
    }

    //Alpha Effect End
    spriteRenderer.color = new Color32(255, 255, 255, 255);
    
    isUnBeatTime = false;

    yield return null;
}

캐릭터가 반짝인다던가 그런 효과를 주어서 표시할 수 있는데 코루틴으로 만들 수 있다. 위와 같이 코드를 짜면 unBeatTime 만큼 무적 시간을 부여할 수 있고 캐릭터가 깜박인다.

만약에 unBeatTime이 1이면 i가 9까지 반복문이 반복될 것이다. 0.1초마다 반복되므로 unBeatTime과 같은 1초가 돼야 반복문이 완료되는 것이다. 그리고 스프라이트의 알파값을 변경시켜 깜박이는 효과를 줄 수 있다.

반복문이 끝나면 스프라이트를 원래 색깔로 되돌리고 isUnBeatTime은 false가 된다. 무적 효과가 끝나는 것이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerStat : MonoBehaviour
{
    public float health;
    private float checkHealth;
    private float maxHealth;
    public float speed;
    private float maxSpeed;
    public float damage;
    private float maxDamage;

    public bool isUnBeatTime;
    public float unBeatTime;

    private SpriteRenderer spriteRenderer;

    private void Start() {
        maxHealth = 100.0f;
        maxSpeed = 25.0f;
        maxDamage = 100.0f;

        checkHealth = health;

        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    private void Update() {
        if(health != checkHealth)
        {
            isUnBeatTime = true;
            StartCoroutine("UnBeatTime");
        }
    }

    private void LateUpdate() {
        checkHealth = health;

        //임시 죽음
        if(health <= 0)
        {
            Die();
        }
    }

    void Die()
    {
        GameManager.GetInstance().playerDead = true;

        //Die Motion
        //animator.Play("Die");

        //삭제 시키기
        Destroy(gameObject);
    }

    IEnumerator UnBeatTime()
    {
        for(int i = 0; i < unBeatTime*10; ++i)
        {
            if(i%2 == 0)
                spriteRenderer.color = new Color32(255, 255, 255, 90);
            else
                spriteRenderer.color = new Color32(255, 255, 255, 180);

            yield return new WaitForSeconds(0.1f);
        }

        //Alpha Effect End
        spriteRenderer.color = new Color32(255, 255, 255, 255);

        isUnBeatTime = false;

        yield return null;
    }
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다