/ UNITY

미니게임 제작 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;
    }
}
  1. line 9 ~ 19 : 변수 생성 부분
    • 9 : 몬스터 프리팹을 저장할 배열 변수
    • 11 : 주변에 몬스터를 생성할 수 있도록 하기 위한 플레이어 위치 정보를 담을 변수
    • 13, 15 : 최대 거리와 최소 거리, 이 사이에서 랜덤하게 생성 거리가 정해진다.
    • 16, 17 : 생성하는 최대 주기와 최소 주기 이 사이에서 랜덤하게 생성하는 주기가 정해진다.
    • 19 : 가장 최근에 생성된 시간
  2. line 20 ~ 25 : 초기화 부분
    • 생성 주기를 최소와 최대 사이에서 랜덤하게 초기화
  3. line 26 ~ 37 : 일정 주기마다(주기는 랜덤하게 바뀜) 몬스터 생성
    • 28 ~ 26 : 마지막 생성 시점으로부터 생성 주기만큼 시간이 지났다면, 최근 생성시간을 갱신하고, 생성주기를 다시 랜덤하게 바꾼다. 그 후 몬스터를 생성한다.
  4. line 38~44 : 몹 생성하는 메서드
    • GetRandomPoint 메서드로 랜덤 위치를 받아온 뒤, 해당 위치에 Enemy 생성, 배열에서 랜덤하게 몬스터를 선택하고, Instantiate메서드로 클론 생성
  5. line 45 ~ 51 : 랜덤 위치 반환 함수
    • insideUnitCircle : 일정 반지름을 기준으로 한 원 내부에서 랜덤한 위치를 반환
    • distance를 곱해준 값을 center에서 더하여 플레이어를 기준으로 일정 거리 이내에서 몬스터 생성할 위치 반환.

game_33

잘 적용된 모습이다. 적용 과정은 다음과 같다.

game_34

빈 오브젝트를 만들어서 이름을 Enemy Spawner으로 바꿔준다.

그 이후 위의 스크립트를 컴포넌트로써 추가해준다. 최대거리, 최소거리는 상황에 맞게 설정해주고, PlayerTransform에 플레이어 트랜스폼을 넣어주었다.

Enemy 변수에는 일단은 빨간색 원의 오브젝트를 프리팹(prefab)화 시켜서 추가해주었다.

다음에는 몹 스프라이트 적용과, 플레이어를 추적하여 이동하도록 해보겠다.