TIL 45

qkrrlcks00·2024년 10월 30일

카메라 시점

 public void ChangeCam(InputAction.CallbackContext context)
 {
     if (context.phase == InputActionPhase.Started && maincam.activeSelf)
     {
         Thirdcam();
         Debug.Log("secondcam");
     }
     else if (context.phase == InputActionPhase.Started && secondcam.activeSelf)
     {
         Maincam();
         Debug.Log("maincam");
     }
 }
 void Maincam()
 {
     maincam.gameObject.SetActive(true);
     secondcam.gameObject.SetActive(false);
 }

 void Thirdcam()
 {
     maincam.gameObject.SetActive(false);
     secondcam.gameObject.SetActive(true);
 }

V키를 누르면 카메라 시점이 바뀔수 있게 카메라를 1인칭 시점과, 3인칭 시점을 세팅해 놓은뒤
3인칭 카메라를 꺼놓고 V키를 누르면 3인칭 카메라가 켜지고 1인칭카메라가 꺼지는 방식으로 만들었다.

그랫더니 위와같이 1인칭시점에서만 보여야하는 무기가 보여서

1인칭 카메라 depth를 -1, 무기카메라 0, 3인칭 카메라 1 을 부여해서
1인칭 카메라일때만 무기카메라가 보이고 3인칭 카메라일때는 무기카메라가 안보이게 변경하여 해결했다.

움직이는 오브젝트

void MoveObject()
{
    // 이동 방향에 따라 위치 변경
    if (isMovingRight)
    {
        gameobject.transform.localPosition += Vector3.right * moveSpeed * Time.deltaTime;
        if (gameobject.transform.localPosition.x >= limitDistance)
        {
            isMovingRight = false; // 오른쪽 한계에 도달 시 방향 전환
        }
    }
    else
    {
        gameobject.transform.localPosition += Vector3.left * moveSpeed * Time.deltaTime;
        if (gameobject.transform.localPosition.x <= 0)
        {
            isMovingRight = true; // 왼쪽 한계에 도달 시 방향 전환
        }
    }

로컬좌표를 써서 왓다갓다 움직일 수 있게 만들었다.
그냥 만들면 캐릭터가 오브젝트 위에 올라갔을때 같이 움직이지 않고 오브젝트만 움직인다

Collision으로 닿았을때, 움직이는 오브젝트를 부모로 설정해주어 같이 움직이게 만들었다.
그리고 접촉이 끝나면 다시 부모관계 해제를 위해 OnCollisionExit을 사용햇다

if조건식이 발동되는 이유

if 조건에 useStamina를 적었는데 useStamina가 실행됬다. 알아보니

public void OnJumpInput(InputAction.CallbackContext context)
{
    if (context.phase == InputActionPhase.Started && IsGrounded() && CharacterManager.Instance.Player.condition.UseStamina(5))
    {
        rigidbody.AddForce(Vector2.up * jumpForce, ForceMode.Impulse);
    }
}

조건식에서 함수 호출이 평가되면서 실행되기 때문이다. 조건문에서 함수 호출은 그 결과를 평가하기 위해 항상 먼저 실행되므로, UseStamina(5) 함수가 호출되고 반환값이 true인지 false인지에 따라 조건이 결정된다고 한다.

달리기

다음은 쉬프트를 누르면 뛰게 하고 싶어서


 public void OnRunInput(InputAction.CallbackContext context)
 {
     if (context.phase == InputActionPhase.Performed && CharacterManager.Instance.Player.condition.UseStamina(0.1 * Time.deltaTime)) //눌리는동안
     {
         isRunning = true;
     }
     if (context.phase == InputActionPhase.Canceled) 
     {![](https://velog.velcdn.com/images/qkrrlcks00/post/28205338-8c84-4aec-be3f-675d2663cafd/image.png)

         isRunning = false;
     }
 }

runSpeed 변수를 만들고 isRunning이면 빠르게 움직이게 했다.

dir *= isRunning ? runSpeed : moveSpeed;

일단 이렇게 만들었더니, Performed가 눌리는동안 작동하는거라서 stamina가 계속 줄어들줄 알앗는데 그렇지 않았다.
알아보니 Update처럼 계속 부르는게 아니고 일반적으로 누르는 순간 한 번만 호출되며, 버튼을 누르고 있는 동안 지속적으로 호출되는게 아니였다.

 private void Update()
 {
 public void RunningStamina(float stamina)
  {
     if (controller.isRunning)
     {
         CharacterManager.Instance.Player.condition.UseStamina(stamina * Time.deltaTime);
         if (!CharacterManager.Instance.Player.condition.UseStamina(stamina * Time.deltaTime))
         {
             controller.isRunning = false;
         }
     }
 }

그래서 그냥 업데이트문에서 발동될수 있게 했더니 정상 작동했다.

0개의 댓글