플레이어의 자식 오브젝트로 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를 설정해준다.
[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);