Unity için Bölünmüş Ekranlı Aynı Bilgisayar Çok Oyunculu Eğitimi
Bu derste, Unity'te bölünmüş ekran multiplayer'ün nasıl yapılacağını göstereceğim.
Adımlar
- Seviyenizle bir Sahne açın (benim durumumda birkaç Küp içeren basit bir Sahne olacak)
- Yeni bir GameObject oluşturun ve onu çağırın "Player 1"
- Yeni bir Küp oluşturun ve onu "Player 1" nesnesinin içine taşıyın (Box Collider bileşenini kaldırın)
- Gözler ve ağız için birkaç Küp daha oluşturun (Box Collider bileşenlerini de kaldırın)
- Ana Kamerayı "Player 1" nesnesinin içine taşıyın ve bir Küp'e doğrultun
- yeni bir Komut Dosyası oluşturun, onu "RigidbodyPlayerController" olarak adlandırın ve içine aşağıdaki kodu yapıştırın:
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 betiğini "Player 1"'ye ekleyin (Rigidbody ve Capsule Collider olmak üzere 2 bileşen daha ekleyeceğini fark edeceksiniz)
- Kapsül Çarpıştırıcısını Küp boyutlarıyla eşleşene kadar ayarlayın.
Aşağıda 2 oyunculu bölünmüş ekran oluşturma adımları verilmiştir:
- "Player 1" nesnesini çoğaltın ve "Player 2" olarak yeniden adlandırın.
- RigidbodyPlayerController'da Oyuncu Kontrollerini "Arrows" olarak değiştirin.
- "Player 1" Kameranın Viewport Rect değerlerini X: 0 Y: 0,5 W: 1 H: 0,5 olarak değiştirin
- "Player 2" Kameranın Viewport Rect değerlerini şu şekilde değiştirin: X: 0 Y: 0 W: 1 H: 0,5
Alternatif olarak aşağıdaki değerleri ayarlayarak dikey bölünmüş ekran oluşturabilirsiniz:
X: 0 Y: 0 W: 0,5 H: 1 Kamera 1 için
X: 0,5 Y: 0 W: 0,5 H: 1 Kamera 2 için