Unity

그랩팩 개발 일지 2

psb08 2025. 2. 8. 17:45
728x90
반응형

먼저 손을 발사하는 코드를 따로 만든 뒤에 손 마다 코드를 붙혔습니다.

지금은 손이 총 4개로 파란색(물건 집기), 보라색(아직 미정), 주황색(총알 발사), 빨간색 (적 처치)이 있습니다.

주황색 빼고는 모두 손을 발사하므로 주황색을 제외하고 모두 코드를 붙혔습니다.

 

HandFiring.cs

using DG.Tweening;
using UnityEngine;

public class HandFiring : MonoBehaviour
{
    [SerializeField] private int mouseIndex;
    [Space(10)]
    [Header("Value")]
    [Space(10)]
    public Transform player;
    public Transform hand;
    public float grabDistance = 5f;
    public float moveDuration = 0.5f;
    public float returnDelay = 0.2f;
    public float returnDuration = 0.5f;

    private bool isReturning = false;
    private Vector3 startOffset;
    private Tween moveTween;

    private void Update()
    {
        if (Input.GetMouseButtonDown(mouseIndex))
        {
            startOffset = hand.position - player.position;
            Vector3 targetPosition = player.position + player.forward * grabDistance;

            moveTween = hand.DOMove(targetPosition, moveDuration)
                .SetEase(Ease.OutQuad)
                .OnComplete(() => DOVirtual.DelayedCall(returnDelay, StartReturningHand));
        }

        if (isReturning)
        {
            Vector3 returnPosition = player.position + startOffset * 0.2f;
            hand.position = Vector3.Lerp(hand.position, returnPosition, 1);
        }
    }

    private void StartReturningHand()
    {
        isReturning = true;
        DOVirtual.DelayedCall(returnDuration, () =>
        {
            isReturning = false;
        });
    }


}

손을 발사하는 코드 입니다.

DoTween을 사용 했습니다.

 

BlueHand.cs

using DG.Tweening;
using UnityEngine;

[RequireComponent(typeof(HandFiring))]
public class BlueHand : MonoBehaviour
{
    public Transform hand;
    public float grabDistance = 5f;
    public LayerMask grabbableLayer;
    public float throwForce = 5f;
    public float disableColliderTime = 0.2f;

    private bool hasGrabbed = false;
    private GameObject grabbedObject = null;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.E) && grabbedObject != null)
        {
            ReleaseObject();
        }

        if (hasGrabbed && grabbedObject != null)
        {
            grabbedObject.transform.position = hand.position;
        }

    }


    private void OnTriggerEnter(Collider other)
    {
        if (grabbedObject == null && ((1 << other.gameObject.layer) & grabbableLayer) != 0)
        {
            grabbedObject = other.gameObject;
            grabbedObject.transform.SetParent(hand);
            grabbedObject.GetComponent<Rigidbody>().isKinematic = true;
        }
    }

    private void ReleaseObject()
    {
        if (grabbedObject != null)
        {
            grabbedObject.transform.SetParent(null);
            Rigidbody rb = grabbedObject.GetComponent<Rigidbody>();
            Collider objCollider = grabbedObject.GetComponent<Collider>();

            rb.isKinematic = false;
            rb.AddForce(Vector3.up * throwForce, ForceMode.Impulse);

            objCollider.enabled = false;
            DOVirtual.DelayedCall(disableColliderTime, () => objCollider.enabled = true);

            grabbedObject = null;
        }
    }


}

파란 손 코드입니다. 물체를 집고 놓을 수 있습니다.

파란 손 GameObject 입니다. 위 사진처럼 사용했습니다

- Hand Firing => 손 발사 코드

- BlueHand => 파란 손 기능 코드로

 

간단하게 설명 하자면

Hand Firing의

- Mouse Index는 마우스의 왼,오른 클릭을 정합니다.

- 왼쪽 클릭을 원하면 0, 오른쪽 클릭을 원하면 1로 설정하면 됩니다.

- Player는 손이 돌아올 위치입니다.

- Hand는 날아갈 손입니다.

 

BlueHand의 

- Hand는 날아갈 손입니다.

- Grabbable Layer는 잡을 수 있는 물체의 Layer 입니다.

- Throw Force는 물체를 놓을 때의 힘입니다.

- Disable Collider Time은 물체를 놓고 잠시 콜라이더를 끄는 시간입니다.

    --> 이는 물체를 놓고 바로 잡히지 않기 위해 만들었습니다.

 

나머지 빨간손과 주황색 손은 다음에 이야기 하겠습니다.

'Unity' 카테고리의 다른 글

그랩팩 개발 일지 4  (0) 2025.02.10
그랩팩 개발 일지 3  (0) 2025.02.09
그랩팩 개발 일지  (0) 2025.02.07
지금까지 한 일 2  (0) 2025.02.06
지금까지 한 일 1  (0) 2025.02.06