프로젝트/언데드 서바이벌 프로젝트
5장. 몬스터 만들기
MuscleDeveloper5683
2023. 10. 17. 20:39
728x90
SMALL
1. 오브젝트 만들기
1.1우선 적의 오브젝트를 생성해주자
1.2 각각의 컴포넌트를 추가하자
(애니메이터, 물리작용)
Animator Controller - 적의 애니메이터 컨트롤러 생성 후 넣어주기
Gravity Scale - 중력은 받지 않음으로 0으로 설정
Freeze Rotation - 충돌 시 회전하면 안됨으로 체크
Enemy 오브젝트들을 생성한 모습
2. 적들이 플레이어를 추적하기
2.1 Enemy.Cs를 생성후 작성
LateUpdate란?
- 모든 Update 함수가 호출된 후, 마지막으로 호출된다. 주로 오브젝트를 따라가게 설정한 카메라는 LateUpdate 를 사용한다.
rigidbody의 velocity란?
- Rigidbody의 속도를 나타낸다. Velocitiy를 지정하면 오브젝트의 질량과 상관없이 일정 속도를 준다.
전체 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
// 적의 속도
[SerializeField]
private float enemySpeed = 2.5f;
// 따라갈 목표
[SerializeField]
private Rigidbody2D target;
// 생존 여부
private bool isLive = false;
private Rigidbody2D enemyRigidbody;
private SpriteRenderer enemySpriteRen;
void Awake()
{
enemyRigidbody = GetComponent<Rigidbody2D>();
enemySpriteRen = GetComponent<SpriteRenderer>();
isLive = true;
}
private void FixedUpdate()
{
// 만약 몬스터가 살아있지 않을 경우 실행 x
if(!isLive)
return;
// 플레이어와 적의 위치거리
Vector2 directionPosition = target.position - enemyRigidbody.position;
// 적이 이동헤야할 방향의 거리의 값
Vector2 nextPosition = directionPosition.normalized * enemySpeed * Time.fixedDeltaTime;
// 적이 타겟을 향해 이동
enemyRigidbody.MovePosition(enemyRigidbody.position + nextPosition);
// 적과 플레이어가 충돌 시 물리 속도의 영향을 주지 않기 위해 0으로 지정
enemyRigidbody.velocity = Vector2.zero;
}
// 모든 Update 함수가 호출된 후, 마지막으로 호출됩니다. 주로 오브젝트를 따라가게 설정한 카메라는 LateUpdate 를 사용
private void LateUpdate()
{
if(!isLive)
return;
// 적의 시선(방향)처리 - 적을 기준으로 플레이어가 왼,오 인지 체크해서 바라보게
enemySpriteRen.flipX = target.position.x < enemyRigidbody.position.x;
}
}
3. 몬스터 재배치
만약 플레이어의 이동속도가 적의 이동속도보다 빠를경우 적은 따라오지 못할 것 이다. 플레이어가 이동한 위치에 적들이 리스폰 되게 해보자
3.1 적의 충돌 처리를 위해 Collider를 사용하자
3.2 적이랑 플레이어의 충돌 Area의 충돌감지
Random.Range 를 사용하여 랜덤한 위치에서 리스폰 되게
3.3 Enemy 오브젝트에 Reposition.cs 도 추가해주자
작성 코드
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UIElements;
public class Reposition : MonoBehaviour
{
private Collider2D enemyCollider;
void Awake()
{
enemyCollider = GetComponent<Collider2D>();
}
// 오브젝트 충돌을 감지하는 함수
private void OnTriggerExit2D(Collider2D collision)
{
// 플레이어의 이동 방향을 저장하기 위한 변수 추가
Vector3 playerDirection = GameManager.Instance.player.InputVector;
// 이 스크립트가 달린 오브젝트가 어떤 태그랑 충돌하는지 체크하기 위해서
switch(transform.tag)
{
// 적일 경우
case "Enemy":
// 적의 충돌이 활성화 일때만(죽었을 경우 충돌나면 안되기 때문에)
if(enemyCollider.enabled)
{
// 플레이어가 가는 방향 * 타일맵의 크기 + 랜덤한 x,y의 위치
// X : -3에서 3사이에 랜덤 , Y : -3 에서 3사이에 랜덤 , Z는 해당사항 없음
this.transform.Translate(playerDirection * 20f + new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f), 0f));
}
break;
}
}
}
실행 모습
728x90