Unity용 분할 화면 동일 PC 멀티플레이어 튜토리얼

이 튜토리얼에서는 Unity에서 분할 화면 멀티플레이어를 만드는 방법을 보여 드리겠습니다.

단계

  • 레벨이 있는 씬을 엽니다(제 경우에는 일부 큐브가 포함된 간단한 씬이 됩니다)

  • 새로운 GameObject를 생성하고 호출합니다. "Player 1"
  • 새 큐브를 생성하고 "Player 1" 개체 내부로 이동합니다(Box Collider 구성 요소 제거).
  • 눈과 입에 대한 큐브를 몇 개 더 만듭니다(Box Collider 구성 요소도 제거).

  • 메인 카메라를 "Player 1" 개체 내부로 이동하고 큐브를 가리킵니다.

  • 새 스크립트를 만들고 이름을 "RigidbodyPlayerController"로 지정한 후 그 안에 아래 코드를 붙여넣습니다.

RigidbodyPlayerController.cs

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(CapsuleCollider))]

public class RigidbodyPlayerController : MonoBehaviour
{

    public enum PlayerControls { WASD, Arrows }
    public PlayerControls playerControls = PlayerControls.WASD;
    public float movementSpeed = 3f;
    public float rotationSpeed = 5f;

    Rigidbody r;
    float gravity = 10.0f;

    void Awake()
    {
        r = GetComponent<Rigidbody>();
        r.freezeRotation = true;
        r.useGravity = false;
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        // Move Front/Back
        Vector3 targetVelocity = Vector3.zero;
        if ((playerControls == PlayerControls.WASD && Input.GetKey(KeyCode.W)) || (playerControls == PlayerControls.Arrows && Input.GetKey(KeyCode.UpArrow)))
        {
            targetVelocity.z = 1;
        }
        else if ((playerControls == PlayerControls.WASD && Input.GetKey(KeyCode.S)) || (playerControls == PlayerControls.Arrows && Input.GetKey(KeyCode.DownArrow)))
        {
            targetVelocity.z = -1;
        }
        targetVelocity = transform.TransformDirection(targetVelocity);
        targetVelocity *= movementSpeed;

        // Apply a force that attempts to reach our target velocity
        Vector3 velocity = r.velocity;
        Vector3 velocityChange = (targetVelocity - velocity);
        float maxVelocityChange = 10.0f;
        velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
        velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
        velocityChange.y = 0;
        r.AddForce(velocityChange, ForceMode.VelocityChange);

        // We apply gravity manually for more tuning control
        r.AddForce(new Vector3(0, -gravity * r.mass, 0));


        // Rotate Left/Right
        if ((playerControls == PlayerControls.WASD && Input.GetKey(KeyCode.A)) || (playerControls == PlayerControls.Arrows && Input.GetKey(KeyCode.LeftArrow)))
        {
            transform.Rotate(new Vector3(0, -14, 0) * Time.deltaTime * rotationSpeed, Space.Self);
        }
        else if ((playerControls == PlayerControls.WASD && Input.GetKey(KeyCode.D)) || (playerControls == PlayerControls.Arrows && Input.GetKey(KeyCode.RightArrow)))
        {
            transform.Rotate(new Vector3(0, 14, 0) * Time.deltaTime * rotationSpeed, Space.Self);
        }
    }
}
  • RigidbodyPlayerController 스크립트를 "Player 1"에 연결합니다(Rigidbody 및 Capsule Collider라는 구성 요소 2개가 더 추가되는 것을 볼 수 있습니다)
  • 큐브 크기와 일치할 때까지 Capsule Collider를 조정합니다.

2인용 분할 화면을 만드는 단계는 다음과 같습니다.

  • "Player 1" 개체를 복제하고 이름을 "Player 2"로 바꿉니다.
  • RigidbodyPlayerController에서 플레이어 컨트롤을 "Arrows"로 변경합니다.

  • "Player 1" 카메라의 뷰포트 직사각형 값을 X: 0 Y: 0.5 W: 1 H: 0.5로 변경합니다.

  • "Player 2" 카메라의 뷰포트 직사각형 값을 X: 0 Y: 0 W: 1 H: 0.5로 변경합니다.

또는 아래 값을 설정하여 수직 분할 화면을 설정할 수 있습니다.

X: 0 Y: 0 W: 0.5 H: 카메라 1의 경우 1

X: 0.5 Y: 0 W: 0.5 H: 카메라 2의 경우 1