개요
설명
게임 슬라임랜처의 슬라임건의 흡입기능과 배출 기능에 대한 3일동안의 구현을 시작하도록 한다
흡입했을때 오브젝트가 보관UI에 반영되고 배출시에도 보관 UI에 반영되는 UI업데이트까지 핵심으로 구현한후 +디자인, 사운드등 비주얼적인 부분도 행해질 예정이다

기능 분석




기능 구현
슬라임건 움직임
> 플레이어 오브젝트 구성

>마우스 Input 상태(기본)

| ● 마우스 Input 설명 |
| 마우스 움직임이 Delta로 X, Y 좌표값이 아닌 화면상 마우스가 이동한 이동량에 대한 값으로 input actions에 설정이 되어있음 |
>마우스 움직임 코드
[Header("오브젝트 각도")]
[SerializeField] Transform yawPivot; // 좌우 회전
[SerializeField] Transform pitchPivot; // 상하 회전
[Header("회전각도 제한")]
[SerializeField] float minPitch = -30f;
[SerializeField] float maxPitch = 30f;
[SerializeField] float minYaw = -60f;
[SerializeField] float maxYaw = 60f;
[Header("마우스 민감도")]
[SerializeField] private float mouseSensitivity = 0.10f; //보통 0.05~0.2 사이로 튜닝
[Header("움직임 속도")]
[SerializeField] private float smooth = 18f; // 0이면 즉시 반영, 10~25 추천
[Header("옵션")]
[SerializeField] private bool lockCursor = true; // 마우스 커서 잠금 여부
// 마우스 입력값
Vector2 lookDelta;
float yaw;
float pitch;
// 초기 회전값 저장
private Quaternion baseYawRot;
private Quaternion basePitchRot;
private void Start()
{
if (lockCursor) // 처음 시작시 마우스 록온
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
// base 회전값 저장
baseYawRot = yawPivot.localRotation;
if (pitchPivot != null)
basePitchRot = pitchPivot.localRotation;
}
private void Update()
{
MouseRotate();
}
private void LateUpdate()
{
MoveMouse();
}
//============= 슬라임건 회전 ================
public void OnLook(InputValue value)
{
lookDelta = value.Get<Vector2>();
}
private void MouseRotate()
{
if(isLookOff) { return; } // 록온 상태가 아닐 때는 회전하지 않음
if (yawPivot == null || pitchPivot == null) { return; }
yaw += lookDelta.x * mouseSensitivity; // 마우스 입력에 민감도 적용
pitch -= lookDelta.y * mouseSensitivity;
// 회전각도 제한
yaw = Mathf.Clamp(yaw, minYaw, maxYaw); // 좌우 회전 제한
pitch = Mathf.Clamp(pitch, minPitch, maxPitch); // 상하 회전 제한
}
private void MoveMouse()
{
if (isLookOff) { return; } // 록온 상태가 아닐 때는 회전하지 않음
if (yawPivot == null || pitchPivot == null) { return; }
float t = (smooth <= 0f) ? 1f : (1f - Mathf.Exp(-smooth * Time.deltaTime));
Quaternion targetYaw = Quaternion.AngleAxis(yaw, Vector3.up) * baseYawRot;
Quaternion targetPitch = Quaternion.AngleAxis(pitch, Vector3.right) * basePitchRot;
yawPivot.localRotation = Quaternion.Slerp(yawPivot.localRotation, targetYaw, t);
pitchPivot.localRotation = Quaternion.Slerp(pitchPivot.localRotation, targetPitch, t);
}
| ● 록온 코드 설명 |
| 슬라임건에 움직임에 집중할수있게 처음 실행시 별도의 버튼 입력값이 없을땐 초기상태로 마우스포인터를 보이지 않게 하고 마우스를 게임화면에 가둠 |
| ● 마우스 움직임 연산 코드 설명 |
| 마우스의 delta.x와 delta.y 즉 상하좌우 움직임 민감도는 mouseSensitivity값의 따라 달라짐 상하좌우 min, max값에 따라 최대, 최소로 움직임각도가 제한됨 |
| ● 마우스 움직임 코드 설명 |
| 프레임레이트과 상관없는 시간기반으로 회전을 부드러운 움직임을 만들어냄 base값을 정하여 오브젝트가 scene창에서 임의로 배치한 초기값을 지켜주면서 그 초기값을 기준으로 회전각도를 움직임 float t 값만큼 Quaternion target 값을 상하좌우.localRotation값에 보간 적용함으로써 회전움직임을 구현 |

슬라임건 흡입과 록온 버튼 기능
> 흡입버튼 Input상태(기본)

| ● 흡입 Input 설명 |
| 래퍼런스 게임인 슬라임 랜처의 흡입기능의 경우 마우스 왼쪽 버튼을 '누르고 있는 동안' 흡입기능이 활성화 되고 흡입파티클이 on 상태가 됨 그리고 버튼을 '때면' 흡입기능이 비활성화 되고 흡입파티클이 off 됨 그래서 흡입버튼엔 Interactions 탭에 'Press' 기능을 추가하여 input action의 버튼이 눌릴때만이 아닌 땔때의 상황도 체크하도록 설정하는것이 중요함 |
> 록온해제버튼 Input상태

| ● 록온 해제 Input 설명 |
| 래퍼런스 게임인 슬라임 랜처의 흡입기능의 경우 Alt키를 '누르고 있는 동안' 모든 행동이 멈추고 마우스포인터가 나타남 그리고 UI 조작이 가능함(흡입기능이 꺼지면서 나오는 파티클도 꺼짐), Alt키를 땔때 슬라임건이 조작이 되며 마우스포인트가 사라지고 마우스는 화면에 갇힘 그리고 UI조작이 불가능해짐 그래서 록온 해제 버튼엔 Interactions 탭에 'Press' 기능을 추가하여 input action의 버튼이 눌릴때만이 아닌 땔때의 상황도 체크하도록 설정하는것이 중요함 |
> 흡입&록온해제버튼 코드
[Header("파티클")]
[SerializeField] GameObject shootParticle;
// 버튼 입력값
bool isAttacking;
bool isLookOff;
//============= 흡입 기능 ================
public void OnAttack(InputValue value)
{
isAttacking = value.isPressed;
Fire();
}
private void Fire() // 흡입시 파티클 활성화와 커서잠금
{
if (isLookOff) { return; } // 록온 상태가 아닐때는 흡입하지 않음
if (isAttacking)
{
shootParticle.SetActive(true);
}
else // 흡입이 끝나면 파티클 비활성화와 커서 잠금 해제
{
shootParticle.SetActive(false);
}
}
//============= 마우스 록온 ================
public void OnLookOn(InputValue value)
{
isLookOff = value.isPressed;
LockOn();
}
private void LockOn()
{
if (isLookOff)
{
shootParticle.SetActive(false); // 록온이 풀릴 때 공격 상태도 해제
lockCursor = false;
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
else
{
lockCursor = true;
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
}
| ● 흡입 코드 설명 |
| .isPressed로 ture, false를 체크하여 흡입파티클 오브젝트의 setActive를 true, false를 조정함 |
| ● 록온 해제 코드 설명 |
| .isPressed로 ture, false를 체크하여 흡입파티클 오브젝트의 setActive를 false를 조정하고 마우스의 포인터 true, false를 조정함 |

버그수정

| 발생 | 흡입과 록온해체의 버튼을 때도 기능이 멈추질 않고 실행된 상태로 유지됨 |
| 문제 | .isPressed가 버튼을 땔때에도 true에서 false로 반영을 안함 |
| 해결 | 각 '누르는 동안'이라는 조건을 가진 버튼의 Input Action에가서 Interactions 탭에 'Press' 기능을 추가하여 input action의 버튼이 눌릴때만이 아닌 땔때의 상황도 체크하도록 설정함 |
마치며.
1일차에 슬라임건에 기본적인 배경기능을 구현함 이후 흡입로직과 UI업데이트 기능을 추가하도록 하겠음
'연구노트' 카테고리의 다른 글
| [슬라임랜처] 슬라임건 기능구현-3(완) (0) | 2026.02.20 |
|---|---|
| [슬라임랜처] 슬라임건 기능구현-2 (0) | 2026.02.19 |
| 연구노트_기존 사운드 매니저 방식 수정 (0) | 2026.02.13 |