Unity

3D 테스트 프로젝트 12

psb08 2025. 3. 5. 16:09
728x90

플레이어가 공격할 때 플레이어 시점으로 변환 되어서 공격을 하도록 수정하였습니다.

 

CamChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CamChange : MonoBehaviour
{
    public Camera mainCam;
    public Camera[] cams;

    private void Start()
    {
        mainCam.gameObject.SetActive(true);
        for (int i = 0; i < cams.Length; i++)
        {
            cams[i].enabled = false;
        }
    }

    public void CameraSetting(int num)
    {
        switch (num)
        {
            case 1:
                cams[0].enabled = true;
                cams[1].enabled = false;
                cams[2].enabled = false;
                cams[3].enabled = false;
                break;
            case 2:
                cams[0].enabled = false;
                cams[1].enabled = true;
                cams[2].enabled = false;
                cams[3].enabled = false;
                break;
            case 3:
                cams[0].enabled = false;
                cams[1].enabled = false;
                cams[2].enabled = true;
                cams[3].enabled = false;
                break;
            case 4:
                cams[0].enabled = false;
                cams[1].enabled = false;
                cams[2].enabled = false;
                cams[3].enabled = true;
                break;
        }
    }

    public void MainCamSet()
    {
        mainCam.enabled = true;
        cams[0].enabled = false;
        cams[1].enabled = false;
        cams[2].enabled = false;
        cams[3].enabled = false;
    }

}

 

플레이어가 넷이라 그냥 카메라를 4개 만든 뒤, 끄고 키도록 만들었습니다.

시작할 때 메인 카메라를 끄고 모든 캠들을 끕니다.

 

CameraSetting 메서드에서 1이 들어가면 인덱스의 0번 째, 즉 맨 처음 카메라가 켜집니다.

 

TurnManager의 NextTime 메서드입니다.

public IEnumerator NextTime()
{
    currentTurnIndex++;

    if (currentTurnIndex >= turnOrder.Count)
    {
        currentTurnIndex = 0;
    }

    object currentCharacter = turnOrder[currentTurnIndex];
    turnDisplay.UpdateCurrentTurn(currentCharacter);
    turnDisplay.UpdateTurnList(turnOrder, currentTurnIndex);

    yield return new WaitForSeconds(0.5f);

    Debug.Log($"{(currentCharacter is Player ? (currentCharacter as Player).CharacterName : (currentCharacter as Enemy).CharacterName)}의 턴입니다.");

    if (currentCharacter is Enemy enemy)
    {
        enemy.AttackRandomPlayer();
        yield return new WaitForSeconds(1f);
        StartCoroutine(NextTime());
    }
    if (currentCharacter is Player player)
    {
        camChange.mainCam.gameObject.SetActive(false);
        if (player.CharacterName.Contains("1"))
        {
            camChange.CameraSetting(1);
        }
        if (player.CharacterName.Contains("2"))
        {
            camChange.CameraSetting(2);
        }
        if (player.CharacterName.Contains("3"))
        {
            camChange.CameraSetting(3);
        }
        if (player.CharacterName.Contains("4"))
        {
            camChange.CameraSetting(4);
        }

    }
}

 

만약 현재 캐릭터가 Player면 메인 캠을 끕니다.

그 다음 이름에 1이 들어 있다면 첫 번째 캠을 킵니다.

2가 들어 있다면 두 번째, 3이면 세 번째 4라면 네 번째 캠을 킵니다.

 

Enemy의 AttackRandomPlayer 메서드

public void AttackRandomPlayer()
{
    if (playerTransforms.Length > 0)
    {
        int randomIndex = Random.Range(0, playerTransforms.Length);
        Player target = playerTransforms[randomIndex].GetComponent<Player>();
        camChange.CameraSetting(randomIndex + 1);
        if (target != null && target.Health > 0)
        {
            MoveTo(target.transform.position, () =>
            {
                target.Health -= AttackPower;
                Debug.Log($"{CharacterName}가 {target.CharacterName}를 공격했습니다! (남은 체력: {target.Health})");
                MoveTo(originalPosition, null);
            }, AttackMoveSpeed);
        }
    }
}

 

적이 공격할 때 피격되는 플레이어가 화면에 띄워 지도록 CameraSetting을 사용했습니다.

 

 

 

 

728x90

'Unity' 카테고리의 다른 글

3D 테스트 프로젝트 14  (0) 2025.03.07
3D 테스트 프로젝트 13  (0) 2025.03.06
3D 테스트 프로젝트 11  (0) 2025.03.04
3D 테스트 프로젝트 10  (0) 2025.03.03
3D 테스트 프로젝트 9  (0) 2025.03.02