오늘 학습 키워드

유니티 숙련 팀 프로젝트

오늘 학습 한 내용을 나만의 언어로 정리하기

몬스터 만들기

아이디어

  • 일단 몬스터를 세 종류 만듬
    • 전사, 도적, 법사
  • 그리고 그 몬스터들을 미리 배치해둔 정의인 프리셋을 만들어둠
  • 팩토리 패턴을 사용해서 몬스터 매니저를 만들거임.

세 종류의 몬스터들

  • 잘 따라오면서 날 때림
  • 내가 날 때리는 애를 만들어야 한다는 점이 좀 거시기하지만 괜찮음

원거리 몬스터를 만듭시다

  • 기본 몬스터를 상속받는 RangeMonster를 제작
public class RangeMonster : Monster  
{  
    [Header("Range Weapon Settings")]   
    public GameObject projectilePrefab;  
    public Transform projectileSpawn;  
    public float projectileSpeed;  
    public Vector3 projectileRotation;  
      
    public override void Attack()  
    {  
        base.Attack();  
        if (animator != null)  
        {  
            animator.speed = 1f;  
            Debug.Log("원거리 공격");  
            animator.SetTrigger("Attack");  
            Vector3 playerDirection = (CharacterManager.Instance.Player.transform.position - transform.position).normalized;  
            GameObject projectile = Instantiate(projectilePrefab, projectileSpawn.position, Quaternion.LookRotation(playerDirection));  
            projectile.transform.Rotate(projectileRotation);  
            Rigidbody rb = projectile.GetComponent<Rigidbody>();  
            if(rb != null) rb.AddForce(playerDirection * projectileSpeed, ForceMode.Impulse);  
        }  
    }  
}

투사체를 만듭시다

  • 투사체를 만들어서 날리게 함
public class MonsterProjectile : MonoBehaviour  
{  
    private void OnCollisionEnter(Collision other)  
    {  
        if (other.collider.CompareTag("Player"))  
        {  
            Debug.Log("플레이어가 맞았다!");  
            // TODO : 플레이어 맞은거 처리  
        }  
        else if (other.collider.CompareTag("Ground"))  
        {  
            Destroy(gameObject);  
        }  
    }  
}

딴 곳을 보면서 투사체만 나한테 날려요

  • Attack 하기 전에 내 쪽을 보도록 수정함
void AttackingUpdate()  
{  
    // 플레이어와의 거리가 공격 범위 내에 있고, 시야각 내부에 있을 때  
    if (playerDistance < attackDistance && IsPlayerInFieldOfView())  
    {  
        agent.isStopped = true;  
  
        // 플레이어 방향 바라보기  
        Vector3 lookDirection = (CharacterManager.Instance.Player.transform.position - transform.position).normalized;  
        lookDirection.y = 0;   // 고개 안꺾이게
        if (lookDirection != Vector3.zero)  
        {  
            Quaternion targetRotation = Quaternion.LookRotation(lookDirection);  
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);  
        }  
  
        if (Time.time - lastAttackTime > attackRate)  
        {  
            lastAttackTime = Time.time;  
            Attack();  
        }  
    }

잊지말자

  • alt 누르고 위 아래 방향키 누르면 줄이 째로 이동됨