집게사장의 꿈

Photon Fusion Tutorial #2 본문

유니티/Fusion

Photon Fusion Tutorial #2

Krapboss 2024. 6. 4. 18:10

 

https://doc.photonengine.com/ko-kr/fusion/current/tutorials/shared-mode-basics/3-movement-and-camera

 

Fusion 2 3 - Movement & Camera | Photon Engine

In Part 3 the existing scene gets extended by adding player movement based on player input and a first person camera that follows the correct player o

doc.photonengine.com

 

1. 플레이어 이동

 

Fusion은 이존 유니티 프레임 워크인 Update FixedUpdate를 사용해서는 안된다.

FixedUpdateNetwork를 사용해야 네트워크 상 연결된 오브젝트가 각각 연결된다.

 

using Fusion;
using UnityEngine;

public class PlayerMovement : NetworkBehaviour
{
    private CharacterController _controller;

    public float PlayerSpeed = 2f;

    private void Awake()
    {
        _controller = GetComponent<CharacterController>();
    }

    public override void FixedUpdateNetwork()
    {
        // Only move own player and not every other player. Each player controls its own player object.
        if (HasStateAuthority == false)
        {
            return;
        }

        Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Runner.DeltaTime * PlayerSpeed;

        _controller.Move(move);

        if (move != Vector3.zero)
        {
            gameObject.transform.forward = move;
        }
    }
}

 

 

* FixUpdateNetwork에서 실행되는 코드에는 항상 Runner.DeltaTime을 사용

 

 

NetworkTransform의 변경 사항만 StateAuthority다른 모든 사람에게 동기화합니다.

다른 클라이언트가 개체의 위치를 ​​변경하는 경우 해당 변경은 로컬 변경일 뿐이며 나중에 네트워크의 데이터로 재정의됩니다.

 

 

 

2. 사용자 입력 받기

 

1. Update에서 사용자의 입력을 저장, 사용하고 FixedUpdateNEtwork 마지막 줄에서 초기화

2. Use Fusion's NetworkInput with NetworkButtons.

3. 유니티 인풋시스템 사용하는데, Update Mode 를 Manual Update로 설정하고,InputSystem.Update를 FixedUpdateNetwork 에서 호출합니다.

위 옵션들은 Shared 모드에서만 사용가능하고, 다른 모드에서는 오직 NetworkInput 을 이용해야 된다.

 

 

해당 튜토리얼은 1번 방법을 사용

 

using Fusion;
using UnityEngine;

public class PlayerMovement : NetworkBehaviour
{
    private Vector3 _velocity;
    private bool _jumpPressed;

    private CharacterController _controller;

    public float PlayerSpeed = 2f;

    public float JumpForce = 5f;
    public float GravityValue = -9.81f;

    private void Awake()
    {
        _controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (Input.GetButtonDown("Jump"))
        {
            _jumpPressed = true;
        }
    }

    public override void FixedUpdateNetwork()
    {
        // Only move own player and not every other player. Each player controls its own player object.
        if (HasStateAuthority == false)
        {
            return;
        }

        if (_controller.isGrounded)
        {
            _velocity = new Vector3(0, -1, 0);
        }

        Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Runner.DeltaTime * PlayerSpeed;

        _velocity.y += GravityValue * Runner.DeltaTime;
        if (_jumpPressed && _controller.isGrounded)
        {
            _velocity.y += JumpForce;
        }
        _controller.Move(move + _velocity * Runner.DeltaTime);

        if (move != Vector3.zero)
        {
            gameObject.transform.forward = move;
        }

        _jumpPressed = false;
    }
}

점프 시 중력 가속도를 적용한 선형 이동 방식

 

 

 

3. 카메라 연결

 

  1. 로컬 플레이어 개체가 생성되면 카메라를 인스턴스화하도록 합니다.
  2. 로컬 플레이어 개체가 생성되면 카메라를 자체에 연결하도록 합니다.

현재 프로젝트는 2번 방식

 

public override void Spawned()
{
    if (HasStateAuthority)
    {
        Camera = Camera.main;
        Camera.GetComponent<FirstPersonCamera>().Target = transform;
    }
}

 

NetworkBehavivor 에 정의된 Spawned 를 재정의 하여 스폰 후에 카메라 객체를 찾아 타겟을 설정하는 방식을 사용한다.

 

 

Quaternion cameraRotationY = Quaternion.Euler(0, Camera.transform.rotation.eulerAngles.y, 0);
Vector3 move = cameraRotationY * new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Runner.DeltaTime * PlayerSpeed;

플레이어 움직임에 카메라의 Y축 값을 곱해서 마우스 움직임 + 현재 Y축 값

으로 현재 움직임을 추가한다.

 

 


 

Properties

 

HasStateAuthority

클라이언트가 객체를 제하고 움직이는지 확인하는 변수

True => 소유하고 있다

 

'유니티 > Fusion' 카테고리의 다른 글

Fusion 기본 정보  (1) 2024.06.06
[뜯어보기] Asteroids.SharedSimple  (0) 2024.06.06
photon fusion tutorial #3  (1) 2024.06.04
Fusion Shared Tutorial #1  (0) 2024.06.04
Photon Fusion Pun2  (0) 2024.06.04