2022. 1. 15. 02:34ㆍUnity/VR
이번엔 지금까지 만든 스킬에 트리거를 설정해 충돌판정을 제작해서 적의 Hp를 줄이는 스크립트를 짜보겠다. 이번 스크립팅의 가장 큰 쟁점은 기능분리에 초점을 잡았다. 충돌판정의 코드 자체의 내용은 어렵진않으나 앞으로 추가될 기능(피격시 넉백)을 생각하면 기능분리를 잘해놔야 다음 단계 개발에서 문제없이 작성을 할 수 있기 때문이다.
Enemy 피격 처리 클래스
이번 프로젝트에서는 여러가지 스킬에서 데미지와 자신의 스킬형식에 따른 함수를 Enemy에 있는 피격처리 클래스로 메시지를 보내서 피격로직을 진행한다.
먼저 status관련 클래스이다.
public class EnemyStatus : MonoBehaviour
{
public int hp;
public int mp;
public float speed;
}
이 클래스는 온전히 스테이터스만을 위해 만든 클래스라 피격관련 처리는 다른 곳으로 빼는 것으로 진행하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy_AcceptDamage : MonoBehaviour
{
private EnemyStatus enemyStatus;
// Start is called before the first frame update
void Start()
{
enemyStatus = GetComponent<EnemyStatus>();
}
public void Accept_Damage_Oneshot(int damage) // 무적시간과 피격거리조정등 미세조정 들어갈 것임.
{
enemyStatus.hp = enemyStatus.hp - damage;
Debug.Log(enemyStatus.hp);
Check_HP_Zero();
}
public void Accept_Damage_Bombshot(int damage)
{
enemyStatus.hp = enemyStatus.hp - damage;
Debug.Log(enemyStatus.hp);
Check_HP_Zero();
}
public void Accept_Damage_Rapidshot(int damage)
{
enemyStatus.hp = enemyStatus.hp - damage;
Debug.Log(enemyStatus.hp);
Check_HP_Zero();
}
private void Check_HP_Zero()
{
if(enemyStatus.hp <= 0)
{
// 사망이벤트
Destroy(this.gameObject);
}
}
}
이 코드에서는 먼저 EnemyStatus를 조정하기 위해 먼저 Getcomponent를 해준다.
가장 중요한 함수는 아래 부분이다.
public void Accept_Damage_Oneshot(int damage) // 무적시간과 피격거리조정등 미세조정 들어갈 것임.
{
enemyStatus.hp = enemyStatus.hp - damage;
Debug.Log(enemyStatus.hp);
Check_HP_Zero();
}
public void Accept_Damage_Bombshot(int damage)
{
enemyStatus.hp = enemyStatus.hp - damage;
Debug.Log(enemyStatus.hp);
Check_HP_Zero();
}
public void Accept_Damage_Rapidshot(int damage)
{
enemyStatus.hp = enemyStatus.hp - damage;
Debug.Log(enemyStatus.hp);
Check_HP_Zero();
}
지금은 모두 똑같은 내용이지만 피격 종류에 따라 함수를 나눠놓았으니 이 종류에서 미세조정이 들어갈 예정이다.
단발형 스킬 피격처리
코드를 봐보자.
public class GunshotDamege_Trigger : MonoBehaviour
{
private Enemy_AcceptDamage enemy_AcceptDamage;
int damage = 5; //플레이어에서 가져와서 계산할 것
private void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag == "Enemy")
{
GameObject target_Enemy = GameObject.Find(other.gameObject.name);
enemy_AcceptDamage = target_Enemy.GetComponent<Enemy_AcceptDamage>();
enemy_AcceptDamage.Accept_Damage_Oneshot(damage);
}
if (other.gameObject.tag != "Player")
{
Debug.Log(other.gameObject.name);
Destroy(this.gameObject);
}
}
먼저 트리거에 검출된 적에게 데미지를 주기위해 find로 검출대상을 찾고 Getcomponet로 메시지를 보낼 클래스를 찾아준다. 다음은 당연하게 메시지를 보내준다.
마지막 부분 if문은 단발형 스킬이 다른 물체에 부딪혔을 때 삭제를 해주는 것이다.
폭발형 스킬 피격처리
역시 코드를 봐보자.
public class IceBomb_Damage_Trigger : MonoBehaviour
{
private Enemy_AcceptDamage enemy_AcceptDamage;
int damage = 8; //플레이어에서 가져와서 계산할 것
private void OnTriggerEnter(Collider other) // 충돌 갯수만큼 발동되어서 굳이 리스트 처리안해줘도됌.
{
if (other.gameObject.tag == "Enemy")
{
GameObject target_Enemy = GameObject.Find(other.gameObject.name);
enemy_AcceptDamage = target_Enemy.GetComponent<Enemy_AcceptDamage>();
enemy_AcceptDamage.Accept_Damage_Bombshot(damage);
}
}
여기 부분을 설명하기전 OntriggerEnter의 특징에대해서 설명을 해주고 싶다.
OnTriggerEnter는 만약 충돌물체가 100개가 있으면 100개모두 내부 로직을 처리해준다. 충돌 물체가 100개가 있어도 1번만 실행되는 것이 아니라는 뜻이다. 그래서 굳이 다수의 적을 처리해주기위해 리스트 처리를 하지 않아 줘도 된다. 그렇게 되면 나머지 부분은 위 단발형 스킬 피격처리와 같다.
연사형 스킬 피격처리
이 연사형 스킬처리는 특이하게 파티클 콜라이더 처리를 해주었다. 먼저 기본 셋팅이다.
먼저 파티클의 콜리젼부분을 체크해주고 타입을 World로 바꿔준다. 그 뒤 Send Collision Messages를 체크해주면 끝이다. 참고로 이 콜리젼의 레이어 마스크 같은 부분은 Collides With라는 부분이다.
public class RapidFIre_Damage_Trigger : MonoBehaviour
{
private Enemy_AcceptDamage enemy_AcceptDamage;
int damage = 1; //플레이어에서 가져와서 계산할 것
private void OnParticleCollision(GameObject other)
{
if(other.tag == "Enemy")
{
GameObject target_Enemy = GameObject.Find(other.name);
enemy_AcceptDamage = target_Enemy.GetComponent<Enemy_AcceptDamage>();
enemy_AcceptDamage.Accept_Damage_Rapidshot(damage);
}
}
}
여기서 주목할 점은 OnTriggerEnter나 OnCollisionEnter와는 다르게 OnParticlecollision을 쓴 부분이다. 이 함수의 특징이라면 이 스크립트가 붙은 모든 파티클 하나하나에 작동이 된다는 것이다. 예를 들어 파티클 입자가 100개가 나온다면 그 100개 전부다 이 스크립트가 적용된다. 나머지 부분은 위 스킬 로직들과 똑같다.
이렇게 모든 스킬의 피격처리가 완료됐다 다음은 Enemy의 피격함수의 기능을 추가해 넉백같은 기능을 만들어 보겠다.
'Unity > VR' 카테고리의 다른 글
VR 캐주얼 FPS제작 (0) | 2022.06.26 |
---|---|
Unity 스킬 확장 (0) | 2022.02.22 |
Unity GunShot Skill 생성 (0) | 2022.01.12 |
XR Rig Body생성, 스킬 거리 최댓값 주기 (0) | 2021.09.05 |
XR Ray Interactor, Teleportation Area를 통한 이동 시스템 (0) | 2021.09.01 |