Unity_개발일지_21

홍신영·2024년 11월 11일
0

Unity

목록 보기
24/62

장착 아이템(무기)를 손에 들고 있는 것 처럼 보이게 하기

장착 아이템(무기)를 손에 들고 있는 것 처럼 보이게 해보자.

장착아이템을 보여주기 위해서 사용할 방법은 카메라의 CullingMask를 이용할 것이다.

메인카메라는 그대로 두고, 새로운 카메라를 만들어 CullingMask는 원하는 layer만을 보여줄 수 있으니, 무기 layer만을 선택하고 위치를 잡아주면 끝.

파티클 시스템

파티클 시스템은 흔히 게임에서 이펙트에 해당 하는 부분이다. 수천개의 작은 오브젝트들을 관리하고, 사라지고, 어떻게 동작하는 지를 제어하는 시스템이다.

이번에 해볼 것은 발사체가 충돌해 사라질 때 이 파티클이 나타나도록 해줄예정이다.
파티클설정은 취향것 세팅을 해준다.

플레이어 혹은 적들을 지형에 맞게 움직이기 하고 싶을 때 사용을 한다. 해당레벨을 bake를 시키면 bake된 부분이 파란색으로 칠해진다. 이곳이 움직일 수 있는 (walkable)곳이다.

움직이게 하고 싶은 오브젝트에 Agent를 붙혀 이 컴포넌트를 스크립트에서 활용하면 된다.

플레이어에서는 다음과 같이 작성했다.

using System;
using UnityEngine;
using UnityEngine.AI;

public class CharacterController : MonoBehaviour
{
    [SerializeField] private NavMeshAgent agent;
    [SerializeField] private Transform wayPoint;
    [SerializeField] private float attackRange;
    [SerializeField] private float moveSpeed;
    [SerializeField] private float walkToRunTime = 2f;
    [SerializeField] private LayerMask enemyLayer;
    [SerializeField] private float detectRange;

    private float curTime = 0;
    private bool isRunning;
    private bool isAttacking;
    private Transform targetEnemy;

    private void Start()
    {
        agent.speed = moveSpeed;
    }

    private void Update()
    {
        curTime += Time.deltaTime;

        if (agent.speed == moveSpeed)
        {
            Walk();
        }
    }

    private void Walk()
    {
        float distanceToTarget = Vector3.Distance(wayPoint.position, transform.position);

        if(distanceToTarget > detectRange)
        {
            MoveEnemy();
        }

        if (curTime > walkToRunTime && !isRunning)
        {
            Run();
            curTime = 0;
        }

        if (distanceToTarget > attackRange)
        {
            agent.SetDestination(wayPoint.position);
        }
        else
        {
            Attack();
        }
    }

    private void MoveEnemy()
    {
    }

    private void Run()
    {
        if(!isAttacking)
        {
            isRunning = true;
            agent.speed *= 2f;
        }
        else
        {
            agent.speed = moveSpeed;
        }
    }


    private void Attack()
    {
        isAttacking = true;
    }
}

아직 미완성이고 고민중이지만 오늘 작성중이였던 코드를 가져왔다.

Transform으로 목적지를 변수를 만들어 하이어락히에 지정해주고, 네비게이션시스템으로 목표지점까지의 거리가 0보다 크다면 agent.SetDestination()으로 이동하도록 구현하였다.

추가적으로 게임이 처지는 느낌이 들 것 같아 2초정도 walk하면 run으로 바뀌도록 하여 속도감을 주었다.

이제 해야할 것들은
1. 목적지까지의 거리보다 몬스터까지의 거리가 가까우면 몬스터로 이동하기
2. 몬스터로 이동하다가 몬스터까지의 거리가 공격거리보다 같거나 작으면 공격하기
3. 몬스터 어떻게 감지할 것인지 고민하기. 일단은 LayerMask로 하고, enemylayer면~ 이동이런식으로 가능하면 하려고 시도중이다.
4. 위가 다 되면 네비게이션도 스크립트로 동적으로 bake해서 근처 20*20정도를 주기적으로 bake해주도록 할 예정이다. 안그러면 맵이 커질수록 베이크 양이 많아서 성능에 불리할 듯하다.

일단은 여기까지

profile
게임 클라이언트 개발자

0개의 댓글