#이번 주제는 정말 약식으로 작성함(결코 빨리 게임 개발을 하고 싶어서 그런게 아님)
1.스킬 사용 가능UI
1.1.정의
- 마나를 소비하는 스킬을 사용 가능할 때를 알리는 UI 기능
1.2.기획의도
- 스킬 사용 가능 알림
- 현재 게임 안에서 스킬에 대한 정보를 확인할 수 없기 때문에 플레이어 스스로 분석하거나 반복 경험 말고는 없다.
그래서 스킬 버튼 테두리UI를 이용하여 시각적으로 스킬 사용 가능 정보를 플레이어에게 알려주기로 했다.
1.3.구성 요소
1.3.1.스킬 버튼 테두리

- 스킬 사용 가능 유무를 알려주는 UI
1.3.2.스킬 버튼 테두리 색
흰색

- 마나 소비가 없는 스킬
- 조건만 충족되면 상시 사용 가능(이 부분은 반복 경험으로 터득해야)
검정색

- 마나 소비가 필요한 스킬
- 현재 마나가 부족하여 스킬을 사용할 수 없는 상태를 알림
파란색

- 마나 소비가 필요한 스킬
- 현재 마나가 충분하여 스킬을 사용할 수 있는 상태를 알림
1.4.기능 명세
- 스킬 사용 가능 유무 검사
- 스킬 버튼에 연결된 스킬을 사용 가능한지 검사하는 기능
- 스킬 별 마나 소비량과 플레이어의 현재 마나량을 검사 - 스킬 버튼 테두리색 변경
- 스킬 사용 가능 유무에 따라 테두리 색을 변경하는 기능
- 흰색: 상시 사용 가능, 색상 변경 안함
- 검은색: 스킬 사용에 필요한 마나 부족할 때 색상 변경
- 푸른색: 스킬 사용에 필요한 마나 충분할 때 색상 변경
1.5.구현 과정
스킬 사용 가능UI 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ManaNoticeBtn : MonoBehaviour
{
PlayerStats playerStats;
public float fireballManaValue = 25f; //검사할 마나량, 파이어볼 25
public float lightningManaValue = 50f; // 라이트닝 스트라이크 50
public Image outlineBtn1; //색을 변경할 UI ,파이어볼
public Image outlineBtn2; //색을 변경할 UI ,라이트닝스트라이크
private bool fireballOutlineOn = false;
private bool lightningOutlineOn = false;
Color skillOnColor = new Color(78 / 255f, 211 / 255f, 255 / 255f, 255 / 255f); //스킬 사용 가능할 때의 테두리 색상
void Start()
{
outlineBtn1 = GameObject.Find("OutlineSkillBtn1").GetComponent<Image>();
outlineBtn2 = GameObject.Find("OutlineSkillBtn2").GetComponent<Image>();
playerStats = GameObject.Find("Player").GetComponent<PlayerStats>();
}
// Update is called once per frame
void Update()
{
CheckFireballMana();
CheckLightningMana();
FireballOutlineControl();
LightningOutlineControl();
}
void CheckFireballMana()
{
if(playerStats.mana >= fireballManaValue && fireballOutlineOn != true)
{
fireballOutlineOn = true;
}
else if (playerStats.mana < fireballManaValue && fireballOutlineOn != false)
{
fireballOutlineOn = false;
}
}
void CheckLightningMana()
{
if (playerStats.mana >= lightningManaValue && lightningOutlineOn != true)
{
lightningOutlineOn = true;
}
else if (playerStats.mana < lightningManaValue && lightningOutlineOn != false)
{
lightningOutlineOn = false;
}
}
void FireballOutlineControl()
{
if (fireballOutlineOn == true && outlineBtn1.color != skillOnColor)
{
outlineBtn1.color = skillOnColor;
}
else if(fireballOutlineOn == false && outlineBtn1.color != Color.black)
{
outlineBtn1.color = Color.black;
}
}
void LightningOutlineControl()
{
if (lightningOutlineOn == true && outlineBtn2.color != skillOnColor)
{
outlineBtn2.color = skillOnColor;
}
else if (lightningOutlineOn == false && outlineBtn2.color != Color.black)
{
outlineBtn2.color = Color.black;
}
}
}
1.스킬 버튼이 있는 HUD Canvas에 ManaNotionBtn 스크립트 할당
2.스크립트에 스킬 버튼 오브젝트는 스크립트로 할당함
3.각 버튼의 스킬 소비 마나량 설정
2.추락사
2.1.정의
- 플레이어가 맵을 벗어나 추락할 경우 사망하는 기능이다.
2.2.기획의도
- 플레이어가 맵을 이동 중에 이상하게 끼어서 바닥으로 추락할 경우를 대비하여 추락사 구현함
- 플레이어가 맵의 외곽에서 밖으로 순간 이동 스킬로 이동하다가 맵을 벗어나서 추락할 경우를 대비하여 추락사를 구현함(맵 외곽 콜라이더의 넓이를 매우 많이 키워서 순간이동으로 밖으로 나갈 가능성은 없음)
2.3.기능 명세
- 추락사
- 플레이어가 맵을 벗어나서 맵 아래에 있는 Deadzone 콜라이더(Deadzoen 태그)와 접촉 시 플레이어를 사망시킨다.
2.4.구현 과정
1.맵 아래에 맵 외곽에서 순간이동으로 이동할 경우의 거리를 고려한 넉넉한 넓이의 콜라이더 생성

2.해당 콜라이더의 이름을 Deadzone으로 변경, Deadzone 태그로 할당, Is Trigger 적용

3.PlayerStats 스크립트에서 추락사 기능 추가
//트리거와 충돌 시 - 데드존, 아이템 사용
private void OnTriggerEnter(Collider other)
{
if(other.tag == "Deadzone" && !dead)
{
Die();
Debug.Log("사망");
}
// 아이템과 충돌한 경우 해당 아이템을 사용하는 처리
else if (!dead)
{
//충돌한 상대방으로부터 IItem 컴포넌트 가져오기 시도
IItem item = other.GetComponent<IItem>();
//충돌한 상대방으로부터 IItem 컴포넌트를 가져오는 데 성공했다면
if (item != null)
{
//Use 메서드를 실행하여 아이템 사용
item.Use(gameObject);
//아이템 습득 소리 재생
//playerAudioPlayer.PlayOneShot(itemPickupClip);
}
}
}
3.터치 시 콜라이더 무시
3.1.정의
- 게임에서 터치 시 특정 콜라이더를 무시 하는 기능이다.
3.2.기획 의도
- 맵 외곽에서 파이어볼 스킬을 사용했을 경우 외곽 콜라이더로 인해 파이어볼 범위 지정UI를 터치 못하는 문제 해결하기
3.3.콜라이더 무시 방법 구현 과정
1.무시할 외곽 콜라이더 선택 > 인스펙터 > Layer를 Ignore Raycast로 설정

2.Tag는 Obstacle(tag 추가)로 변경하여 파이어볼 충돌 시 폭발 처리하기(파이어볼 발사체에 tag조건 추가)
4.전투 밸런스
기존
구분 | 근접형 AI | 원거리형 AI | 순간 이동형 AI |
최소 체력 | 100 | 150 | 300 |
최대 체력 | 150 | 300 | 500 |
최소 공격력 | 20 | 50 | 50 |
최대 공격력 | 40 | 50 | 100 |
최소 속도 | 3 | 3 | 4 |
최대 속도 | 5 | 3 | 4 |
획득 점수 | 50 | 150 | 300 |
위험도 | 낮음 | 보통 | 높음 |
생성 수 | 다수 | 보통 | 소수 |
개선
구분 | 근접형 AI | 원거리형 AI | 순간 이동형 AI |
최소 체력 | 50 | 150 | 50 |
최대 체력 | 100 | 350 | 150 |
최소 공격력 | 20 | 30 | 75 |
최대 공격력 | 40 | 60 | 150 |
최소 속도 | 3 | 3 | 4 |
최대 속도 | 3.5 | 3 | 4 |
획득 점수 | 50 | 300 | 100 |
위험도 | 낮음 | 높음 | 보통 |
생성 수 | 다수 | 보통 | 소수 |
스킬 데미지
스킬 이름 | 데미지 |
일반 공격 | 50 |
파이어볼 | 150 |
라이트닝 스트라이크 | 300 |
초기 전투 밸런스를 설정할 때 데이터(반복 플레이 경험)가 없어서 구체적인 수치보다는 '이런 플레이 경험을 주고 싶다'정도의 아이디어를 기준으로 임의대로 밸런스를 잡았다.
근접형 AI의 경우 다수 생성되기 때문에 속도가 같으면 다같이 움직여서 별로일 것 같아서 속도를 3~5로 설정하여 적들이 몰려오는 느낌을 분산해서 표현하고 싶었다. 실제 테스트 해보니 속도가 4이상 이면 플레이어를 금방 따라잡아서 플레이 하기 어려웠다. 속도의 폭을 3~3.5로 수정했는데 분산되서 추적하는 모습이 괜찮았고, 속도도 적절해서 플레이어가 공격하기 좀 더 수월해졌다. 적의 체력의 경우 플레이어가 일반 공격(50)을 2~3회 공격 해야 처치될 수 있게 생각했으나 생각보다 생성 수가 많아서 플레이어가 2~3회 공격할 시간이 부족했다. 따라서 1~2회 공격하여 처치할 수 있게 체력을 수정했다.
원거리형 AI의 경우 원거리에서 공격하기 때문에 하나씩 각개격파형태로 처리 가능하다고 판단했고, 보통 위험도로 어느정도 체력있도록 설정했다. 하지만 전투 테스트 시 가장 위협적인 존재였다. 사방에서 날아오는 적의 마법구가 상당히 피하기도 어려웠고 피격 시 데미지도 높았다. 그리고 의외로 적의 원거리 공격을 피하고 공격하는 재미가 있었다. 좋은 재미요소라고 판단해서 보통 위험도에서 높은 위험도로 변경했고 그에 맞게 체력, 획득 점수, 데미지를 수정했다.
최대 체력은 350으로 수정했는데 가장 강력한 스킬인 라이트닝 스트라이크에 공격을 당해도 몇몇의 원거리형 적들이 살아남게 하려고 했다. 이유는 대부분의 적들이 라이트닝스트라이크에 처리가 되어 플레이어가 스킬 만능주의에 빠져서 긴장감 없이 플레이할 것 같았다. 스킬 공격을 당해도 몇몇의 적들이 남아서 공격하여 플레이어에게 긴장감을 주고 싶었다.(플레이어의 방심 방해하기)
순간 이동형 적의 경우 빠르게 접근하는데 체력이 높아서 일반 공격으로 빠르게 처리가 어려웠다. 그리고 공격 속도도 느려서 그렇게 치명적인 적이 아니였고 그냥 체력만 많은 귀찮은 적 느낌이었다. 생성 수가 적지만 체력은 일반 공격 1~3회에 처치될 수 있게 변경했고 대신 공격력을 1.5배 높여서 좀 더 치명적인 공격을 할 수 있게 개선했다.
빠른 이동 속도와 순간이동 기능이 상당히 잘 어울려서 순식간에 플레이어에게 접근하는 역할은 잘 수행해서 이 부분은 변경하지 않았다.
전투 테스트를 통해서 스킬의 공격력도 확실하게 정했다. 일반 공격 데미지는 50이고 체력이 낮은 적들을 처리하는 용도로 설정했다. 파이어볼 데미지는 150이고 중간 위험도의 적까지는 한 방에 처치할 수 있게 했다. 라이트닝 스트라이크 데미지는 300이고 가장 데미지가 높아서 대부분의 적들을 한 방에 처치할 수 있게 했다.
5.네비 메쉬와 비효율적인 적 AI 이동 문제 해결
1.전투 테스트 도중 특정 구역(맵 모서리)에서 비효율적인 적 AI 이동을 감지했다.

2.아마도 원인은 네비 메쉬 생성가 잘게 나눠져서 생성이 되서 그런 것 같았다.(모서리 부분에 잘게 선이 많이 있음)

3.내가 근본적인 해결을 할 수 없어서 OffMeshLink로 해당 구역을 하나 하나 연결해서 적 AI들이 이동할 수 있게 했다.

4.Bi Directional을 체크하면 Start와 End 서로 왕래 가능, 체크 해제하면 Start에서 End 방향으로만 이동 가능

'게임 개발 > 유니티 게임 개발 일지' 카테고리의 다른 글
#20 BGM, 효과음 적용하기 (0) | 2020.08.20 |
---|---|
#19 게임 Title 화면 구현, 오클루전 컬링 적용 (0) | 2020.08.18 |
#17 PlayerSpawner, ItemSpawner, ObstacleSpawner 구현 (0) | 2020.08.11 |
#16 UIManager, GameManager, EnemySpawner 구현 (0) | 2020.08.09 |
#15 맵 구현하기 (0) | 2020.07.29 |
댓글