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 |