Camera của người thứ ba trong Unity

Camera của người thứ ba là loại camera được đặt phía sau người chơi, thường hơi lệch sang một bên, thể hiện trực quan cấp độ trò chơi và chính người chơi.

Để tạo máy ảnh Bắn súng góc nhìn thứ ba (TPS) trong Unity, chúng tôi sẽ sử dụng kết hợp chuyển động của người chơi thông thường và góc nhìn của người thứ ba.

Sharp Coder Trình phát video

Bước 1: Tạo Trình điều khiển trình phát

Đầu tiên, chúng ta sẽ tạo bộ điều khiển Player để xử lý việc xoay và chuyển động:

  • Tạo một Game Object mới (Game Object -> Create Empty) và đặt tên cho nó "Player"
  • Tạo một Capsule mới (Đối tượng trò chơi -> Đối tượng 3D -> Capsule) và di chuyển nó vào trong Đối tượng "Player"
  • Loại bỏ thành phần Capsule Collider khỏi Capsule và thay đổi vị trí của nó thành (0, 1, 0)
  • Tạo một GameObject mới và đặt tên là "CameraParent" và di chuyển nó vào trong Đối tượng "Player", thay đổi vị trí của nó thành (0, 1.64, 0)
  • Di chuyển Camera chính bên trong Đối tượng "CameraParent" và di chuyển nó ra phía sau Trình phát (Trong trường hợp của tôi, tôi đã di chuyển nó đến vị trí này: (0,5, 0,6, -2,9))

Camera góc nhìn thứ ba trong Unity

  • Tạo một Tập lệnh mới, đặt tên là SC_TPSController và dán mã bên dưới vào trong tập lệnh đó:

SC_TPSController.cs

using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_TPSController : MonoBehaviour
{
    public float speed = 7.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Transform playerCameraParent;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 60.0f;

    CharacterController characterController;
    Vector3 moveDirection = Vector3.zero;
    Vector2 rotation = Vector2.zero;

    [HideInInspector]
    public bool canMove = true;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
        rotation.y = transform.eulerAngles.y;
    }

    void Update()
    {
        if (characterController.isGrounded)
        {
            // We are grounded, so recalculate move direction based on axes
            Vector3 forward = transform.TransformDirection(Vector3.forward);
            Vector3 right = transform.TransformDirection(Vector3.right);
            float curSpeedX = canMove ? speed * Input.GetAxis("Vertical") : 0;
            float curSpeedY = canMove ? speed * Input.GetAxis("Horizontal") : 0;
            moveDirection = (forward * curSpeedX) + (right * curSpeedY);

            if (Input.GetButton("Jump") && canMove)
            {
                moveDirection.y = jumpSpeed;
            }
        }

        // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
        // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
        // as an acceleration (ms^-2)
        moveDirection.y -= gravity * Time.deltaTime;

        // Move the controller
        characterController.Move(moveDirection * Time.deltaTime);

        // Player and Camera rotation
        if (canMove)
        {
            rotation.y += Input.GetAxis("Mouse X") * lookSpeed;
            rotation.x += -Input.GetAxis("Mouse Y") * lookSpeed;
            rotation.x = Mathf.Clamp(rotation.x, -lookXLimit, lookXLimit);
            playerCameraParent.localRotation = Quaternion.Euler(rotation.x, 0, 0);
            transform.eulerAngles = new Vector2(0, rotation.y);
        }
    }
}
  • Đính kèm tập lệnh SC_TPSController vào đối tượng "Player" (Bạn sẽ nhận thấy rằng nó cũng đã thêm một thành phần khác gọi là Bộ điều khiển ký tự. Thay đổi giá trị trung tâm của nó thành (0, 1, 0))
  • Gán đối tượng "CameraParent" cho biến "Player Camera Parent"

Bước 2: Thêm phát hiện va chạm camera

Tính năng phát hiện va chạm của Camera sẽ bao gồm một tập lệnh kiểm tra xem có vật gì giữa Máy ảnh và Trình phát hay không, đồng thời sẽ tự động di chuyển Máy ảnh đến gần hơn, do đó ngăn Máy ảnh cắt xuyên qua các vật thể.

  • Tạo một tập lệnh mới, đặt tên là SC_CameraCollision rồi dán đoạn mã bên dưới vào trong tập lệnh đó:

SC_CameraCollision.cs

using UnityEngine;

public class SC_CameraCollision : MonoBehaviour
{
    public Transform referenceTransform;
    public float collisionOffset = 0.3f; //To prevent Camera from clipping through Objects
    public float cameraSpeed = 15f; //How fast the Camera should snap into position if there are no obstacles

    Vector3 defaultPos;
    Vector3 directionNormalized;
    Transform parentTransform;
    float defaultDistance;

    // Start is called before the first frame update
    void Start()
    {
        defaultPos = transform.localPosition;
        directionNormalized = defaultPos.normalized;
        parentTransform = transform.parent;
        defaultDistance = Vector3.Distance(defaultPos, Vector3.zero);

        //Lock cursor
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    // LateUpdate is called after Update
    void LateUpdate()
    {
        Vector3 currentPos = defaultPos;
        RaycastHit hit;
        Vector3 dirTmp = parentTransform.TransformPoint(defaultPos) - referenceTransform.position;
        if (Physics.SphereCast(referenceTransform.position, collisionOffset, dirTmp, out hit, defaultDistance))
        {
            currentPos = (directionNormalized * (hit.distance - collisionOffset));

            transform.localPosition = currentPos;
        }
        else
        {
            transform.localPosition = Vector3.Lerp(transform.localPosition, currentPos, Time.deltaTime * cameraSpeed);
        }
    }
}
  • Đính kèm tập lệnh SC_CameraCollision vào Camera chính
  • Gán đối tượng "CameraParent" cho biến "Reference Transform"
  • Tinh chỉnh các giá trị "Collision Offset" và "Camera Speed" trong trường hợp Camera cắt xuyên tường

Camera TPS hiện đã sẵn sàng, nhấn Play để kiểm tra.

Nguồn
TPSCamera.unitypackage172.07 KB