미니게임 제작 04
앞으로는 간단한 게임들을 만들어보며 추가적인 기능에 대해 공부를 해보려한다. 간단한 것부터 만들기 시작하여 만든 결과물을 레퍼런스 하여 덩치를 조금씩 키워나가는 과정을 밟아보자. 지식이 많지 않아 부족할 수 있지만, 하는데까지 해보겠다.
//Animation
if (anim.GetInteger("vAxisRaw") != V)
{
if (anim.GetInteger("hAxisRaw") != 0 && anim.GetInteger("vAxisRaw") == 0)
{
anim.SetInteger("hAxisRaw", (int)H);
anim.SetBool("isChange", true);
}
else
{
anim.SetInteger("vAxisRaw", (int)V);
anim.SetBool("isChange", true);
}
}
else if (anim.GetInteger("hAxisRaw") != H)
{
anim.SetInteger("hAxisRaw", (int)H);
anim.SetBool("isChange", true);
}
else
{
anim.SetBool("isChange", false);
}
애니메이션 대각선 이동 적용에 관련하여, 문제점을 하나 더 발견하여 위 코드와 같이 바꾸어주었다. 3번 라인에 조건을 하나 더 추가했다.
다음으로 적 유닛을 랜덤하게 생성해보도록 하자.
전체 스크립트는 다음과 같다.
EnemySpawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class EnemySpawner : MonoBehaviour
{
// 몬스터
public GameObject[] enemys;
// 플레이어 위치
public Transform playerTransform;
// 최대거리
public float maxDist = 8f;
// 최소거리
public float minDist = 3f;
public float timeSpawnMax = 5f; // 최대 주기
public float timeSpawnMin = 2f; // 최소 주기
public float timeSpawn;
private float lastSpawn; // 가장 최근 생성
void Start()
{
// 생성 주기 최소와 최대 사이에서 랜덤하게 초기화
timeSpawn = Random.Range(timeSpawnMin, timeSpawnMax);
lastSpawn = 0;
}
void Update()
{
if (Time.time >= lastSpawn + timeSpawn)
{
// 최근 생성 시간 갱신
lastSpawn = Time.time;
// 생성주기 랜덤 변경
timeSpawn = Random.Range(timeSpawnMin, timeSpawnMax);
Spawn();
}
}
void Spawn()
{
Vector2 spawnPos = GetRandomPoint(playerTransform.position, maxDist);
Debug.Log(spawnPos);
GameObject selectedEnemy = enemys[Random.Range(0, enemys.Length)];
GameObject enemy = Instantiate(selectedEnemy, spawnPos, Quaternion.identity);
}
Vector2 GetRandomPoint(Vector2 center, float distance)
{
// 중아을 중심으로 반지름이 maxDist인 원 안에서 랜덤 위치 저장
// Random.insideUnitCircle은 반지름이 distance에서
Vector2 randomPos = Random.insideUnitCircle * distance + center;
return randomPos;
}
}
- line 9 ~ 19 : 변수 생성 부분
- 9 : 몬스터 프리팹을 저장할 배열 변수
- 11 : 주변에 몬스터를 생성할 수 있도록 하기 위한 플레이어 위치 정보를 담을 변수
- 13, 15 : 최대 거리와 최소 거리, 이 사이에서 랜덤하게 생성 거리가 정해진다.
- 16, 17 : 생성하는 최대 주기와 최소 주기 이 사이에서 랜덤하게 생성하는 주기가 정해진다.
- 19 : 가장 최근에 생성된 시간
- line 20 ~ 25 : 초기화 부분
- 생성 주기를 최소와 최대 사이에서 랜덤하게 초기화
- line 26 ~ 37 : 일정 주기마다(주기는 랜덤하게 바뀜) 몬스터 생성
- 28 ~ 26 : 마지막 생성 시점으로부터 생성 주기만큼 시간이 지났다면, 최근 생성시간을 갱신하고, 생성주기를 다시 랜덤하게 바꾼다. 그 후 몬스터를 생성한다.
- line 38~44 : 몹 생성하는 메서드
- GetRandomPoint 메서드로 랜덤 위치를 받아온 뒤, 해당 위치에 Enemy 생성, 배열에서 랜덤하게 몬스터를 선택하고, Instantiate메서드로 클론 생성
- line 45 ~ 51 : 랜덤 위치 반환 함수
- insideUnitCircle : 일정 반지름을 기준으로 한 원 내부에서 랜덤한 위치를 반환
- distance를 곱해준 값을 center에서 더하여 플레이어를 기준으로 일정 거리 이내에서 몬스터 생성할 위치 반환.
잘 적용된 모습이다. 적용 과정은 다음과 같다.
빈 오브젝트를 만들어서 이름을 Enemy Spawner으로 바꿔준다.
그 이후 위의 스크립트를 컴포넌트로써 추가해준다. 최대거리, 최소거리는 상황에 맞게 설정해주고, PlayerTransform에 플레이어 트랜스폼을 넣어주었다.
Enemy 변수에는 일단은 빨간색 원의 오브젝트를 프리팹(prefab)화 시켜서 추가해주었다.
다음에는 몹 스프라이트 적용과, 플레이어를 추적하여 이동하도록 해보겠다.