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