[Unity][2D-Game] Undead Survivor (11+)

suhan0304·2023년 11월 9일
0

유니티 - Undead Survivor

목록 보기
14/21
post-thumbnail

Review

  • 능력 업그레이드를 구현했다.
  • 스크립트블 오브젝트로 아이템 데이터를 만든 후에 아이템 5개의 데이터를 만들어주었다.
  • 만들어놓은 데이터를 기반으로 레벨업 버튼을 만들어주었다.
  • 버튼의 OnClick으로 레벨업 함수들을 시행하도록 무기 id별 기능을 지정해주었다.
    - 레벨이 0일 때 클릭 시 무기 오브젝트를 생성 후 플레이어의 자식으로 지정
    - 레벨이 1보다 크면 레벨업을 진행해 준후 각각의 damages, counts에 맞게 속성 수정
  • 무기 말고 장비 또한 Gear 스크립트를 작성해주어 플레이어의 능력치를 업그레이드 할 수 있도록 구현했다.
  • Gear의 레벨이 추후에 추가되는 무기에 적용되도록 ApplyGear를 무기 생성 시, 레벨 업 시에도 적용되도록 BroadCastMessage로 플레이어의 자식 오브젝트들을 대상으로 ApplyGear를 방송시켜주었다.

강의영상 (11+) - 플레이어 무기 장착 표현하기


개발

양손 배치

플레이어의 자식 오브젝트로 2D Object > Sprites > 아무거나를 추가 해준다.

이름은 Hand Left로 설정 후 Crops의 Weapon 0 스프라이트로 지정한다.
- 해당 왼손과 무기가 플레이어의 앞에 나와야 하기 때문에 Order in Layer을 6으로 지정한다.
- 위치를 x = -0.17, y = -0.38, 회전을 z = -35로 설정한다

왼손을 Ctrl + D로 설정한 후 Sprite를 Weapon 3, 이름을 Hand Left로 지정해 준다.
- 오른손은 플레이어의 뒤에 들어가도록 Order in Layer를 4로 설정 해준다.
- 위치는 x = 0.35, y = -0.15으로 수정한다.
- 회전은 시켜주지 않으므로 z = 0으로 수정한다.


반전 컨트롤 구현

플레이어의 방향이 바뀌면 무기의 방향도 반전 되도록 스크립트를 다음과 같이 작성한다.

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

public class Hand : MonoBehaviour
{
    public bool isLeft; //왼손인지 오른손인지 구분
    public SpriteRenderer spriter;

    SpriteRenderer player; //플레이어의 스프라이트 렌더러를 변수로 받아와 FlipX 여부를 확인

    Vector3 rightPos = new Vector3(0.35f, -0.15f, 0f);          // 오른손 위치
    Vector3 rightPosReverse = new Vector3(-0.15f, -0.15f, 0f);  // 반전 됐을때 오른손 위치

    Quaternion leftRot = Quaternion.Euler(0, 0, -35);       // 왼손의 회전을 수정하기 위해 Quaternion 형 사용
    Quaternion leftRotReverse = Quaternion.Euler(0, 0, -135);      // 반전 됐을때 회전


    private void Awake()
    {
        player = GetComponentsInParent<SpriteRenderer>()[1]; 
        //부모의 spriteRenderer은 [1]번에 [0]은 자기 자신의 SpriteRenderer
    }

    private void LateUpdate()
    {
        bool isReverse = player.flipX;

        if(isLeft) // 근접 무기
        {
            //항상 플레이어 기준으로 위치, 회전하기 때문에 local을 사용해야한다.
            transform.localRotation = isReverse ? leftRotReverse : leftRot;
            spriter.flipY = isReverse; //왼손 스프라이트(근접 무기)는 Y축 반전
            spriter.sortingOrder = isReverse ? 4 : 6; //반전 여부에 따라 order Layer 설정
        }
        else // 원거리 무기
        {
            transform.localPosition = isReverse ? rightPosReverse : rightPos;
            spriter.flipX = isReverse;  //오른손 스프라이트(원거리 무기)는 X축 반전
            spriter.sortingOrder = isReverse ? 6 : 4; //반전 여부에 따라 order Layer 설정
        }
    }
}

이 후에 Hand Left, Hand Right의 컴포넌트로 추가해준 후 각 오브젝트의 스프라이터 렌더러를 끌어다가 드래그드랍으로 초기화 시켜준다. (왼손은 isLeft 또한 체크해준다.)


데이터 추가

이제 레벨에 따라 무기가 나타나도록 데이터를 추가해보자.
기존의 Hand Left, Right의 스프라이터를 지우고 비활성화 시켜준다. 이제 itemData에 Sprite hand를 추가해준 후 Data 폴더의 item 0~5까지 hand sprite를 설정해준다.

itemData.cs


[Header("# Weapon")]
public GameObject projectile;
public Sprite hand;


데이터 연동

이제 추가한 데이터를 연동 시켜 손을 출력해보자. Player 스크립트를 다음과 같이 추가 작성한다.


public Hand[] hands;


void Awake()
{
    rigid = GetComponent<Rigidbody2D>();
    spriter = GetComponent<SpriteRenderer>();
    anim = GetComponent<Animator>();
    scanner = GetComponent<Scanner>();
    hands = GetComponentsInChildren<Hand>(true); //true를 넣으면 비활성화 된 오브젝트의 컴포넌트도 가져올 수 있다.
}

GetComponent 함수의 괄호안에 true를 넣으면 비활성화 된 오브젝트의 컴포넌트 또한 가져올 수 있다.

Weapon 스크립트의 init 안에 다음과 같이 추가 작성한다.

// Hand Set
Hand hand = player.hands[(int)data.itemType]; //아이템 타입에 맞는 핸드를 아이템을 hand에 연결
hand.spriter.sprite = data.hand; //추가해놨던 hand sprite를 적용
hand.gameObject.SetActive(true);


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글