遊戲中常見的相機操做

一:相機跟隨

——直接把相機做爲要跟隨物體的子物體
我在製做小地圖相機的時候通常這樣用其餘的狀況都不推薦ide


——計算偏移量求出相機正確的實時位置this

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public Transform targetPos;//跟隨物體的位置
    private Vector3 offset;//偏移量

    private void Start()
    {
        offset = transform.position - targetPos.position;
    }

    private void LateUpdate()
    {
        transform.position = offset + targetPos.position;
    }
}


——算是方法2的升級版(插值移動)spa

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public Transform targetPos;//跟隨物體的位置
    private Vector3 offset;//偏移量

    public float smooth;//平滑度

    private void Start()
    {
        offset = transform.position - targetPos.position;
    }

    private void LateUpdate()
    {
        transform.position = Vector3.Lerp(transform.position, offset + targetPos.position, Time.deltaTime * smooth);
    }
}


——跟隨的物體到達屏幕中心點再進行跟隨
注意視口座標轉換時Z軸也須要轉換,由於是對於相機的操做code

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public Transform targetPos;//跟隨物體的位置

    private Vector3 velocity;//速度

    public float smooth;//平滑度

    private void LateUpdate()
    {
        Follow();
    }

    //相機跟隨
    private void Follow()
    {
        Vector3 middlePos = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, -Camera.main.transform.position.z));
        Vector3 offset = targetPos.position - middlePos;
        Vector3 des = transform.position + offset;
        des.x = 0;
        if (des.y > transform.position.y)
        {
            transform.position = Vector3.SmoothDamp(transform.position, des, ref velocity, smooth);
        }
    }
}
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public Transform targetPos;//跟隨物體的位置

    private float velocity;//速度

    public float smooth;//平滑度

    private void LateUpdate()
    {
        Follow();
    }

    //跟隨相機
    private void Follow()
    {
        float offsetY = targetPos.position.y - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, -Camera.main.transform.localPosition.z)).y;
        float targetY = offsetY + transform.localPosition.y;
        Vector3 pos = transform.localPosition;
        if (targetY > pos.y)
        {
            pos.y = Mathf.SmoothDamp(pos.y, targetY, ref velocity, smooth);
        }
        transform.localPosition = pos;
    }
}


——2D相機跟隨中限制相機的範圍,不超出邊界(與Cineamachine中的2DCamera功能相似)orm

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public Transform playerPos;//玩家位置

    private Vector3 offset;//偏移量

    private void Start()
    {
        offset = transform.position - playerPos.position;
    }

    private void LateUpdate()
    {
        Vector3 targetPos = playerPos.position + offset;
        transform.position = new Vector3(Mathf.Clamp(targetPos.x, -5.3f, 5.3f), Mathf.Clamp(targetPos.y, -3, 3), targetPos.z);
    }
}

二:相機的高級操做

using UnityEngine;

public class CameraController : MonoBehaviour
{
    private Transform playerPos;//玩家位置
    private Vector3 offset;//偏移量

    public int minZoom;//最小縮放
    public int maxZoom;//最大縮放
    public float followSpeed;//跟隨的速度
    public float zoomSpeed;//縮放的速度
    public float rotateSpeed;//旋轉的速度

    private bool isPress;//是否按下

    private void Start()
    {
        playerPos = GameObject.FindGameObjectWithTag(Tag.player).transform;
        offset = this.transform.position - playerPos.position;
    }

    private void LateUpdate()
    {
        Follow();
        Rote();
        Zoom();
    }

    //相機跟隨
    private void Follow()
    {
        this.transform.position = Vector3.Lerp(this.transform.position, playerPos.position + offset, followSpeed * Time.deltaTime);
    }

    //相機縮放
    private void Zoom()
    {
        float distance = offset.magnitude;
        distance = Mathf.Clamp(distance += Input.GetAxis("Mouse ScrollWheel") * zoomSpeed, minZoom, maxZoom);
        offset = offset.normalized * distance;
    }

    //相機旋轉
    private void Rote()
    {
        if (Input.GetMouseButtonDown(1))
        {
            isPress = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            isPress = false;
        }

        if (isPress)
        {
            Vector3 oriPos = transform.position;
            Quaternion oriRot = transform.rotation;

            transform.RotateAround(playerPos.position, playerPos.up, Input.GetAxis("Mouse X") * rotateSpeed);
            transform.RotateAround(playerPos.position, transform.right, -Input.GetAxis("Mouse Y") * rotateSpeed);

            float x = transform.eulerAngles.x;
            if (x < 10 || x > 70)
            {
                transform.position = oriPos;
                transform.rotation = oriRot;
            }
        }
        offset = this.transform.position - playerPos.position;
    }
}
相關文章
相關標籤/搜索