摄像机的跟随

如何实现摄像机跟随
比如摄像机的位置 (0,0,5)
玩家位置为(0,0,2)
一开始先计算摄像机和玩家的位置 是多少首先
摄像机的位置 – 玩家的位置 等于 偏移量(0,0,3)
然后 偏移量 + 玩家的位置 赋值给摄像机就等于 玩家和摄像机之间固定距离是多少
摄像机跟随 建议放在LateUpdate 生命周期中 因为这个生命周期适合做跟随效果

//start中进行初始偏移
  offersPosition = transform.position - target.transform.position;
  //变换后的偏移
   offersPosition =nowPosition - target.transform.position;
   //之后
   放入LateUpdate进行更新摄像机位置
    transform.position = offersPosition + target.transform.position;
   

但是有时候,相机在旋转过程中,会出现相机的下坠或者位置不符合
同样我这里出现了这情况
解决方案:
我通过计算摄像机和人物之间的距离,使其始终保持一定的距离

//start
   var qua = Quaternion.LookRotation(target.transform.position - transform.position);
        var euler = qua.eulerAngles;
        euler.x = 0;
        euler.z = 0;
        euler.y = nowPosition.y;
        qua = Quaternion.Euler(euler);
        transform.rotation = Quaternion.Lerp(transform.rotation, qua, 0.5f);
        //transform.LookAt(target.transform.position);

        offersPosition = transform.position - target.transform.position;
        //求摄像机和目标点之间的距离
        targetDistance = currentDistance = Vector3.Distance(target.transform.position, transform.position);


//变化中写
 currentDistance = Mathf.Lerp(currentDistance, targetDistance, zoomDamp);
///LateUpdate
  transform.position = target.transform.position - transform.forward * currentDistance+new Vector3(0,2,0);

现在展示全部代码,这里我用了easytouch5插件,进行触摸滑动屏幕,改变旋转

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HedgehogTeam.EasyTouch;
public class CameraController : MonoBehaviour
{
    /// <summary>
    /// 目标
    /// </summary>
    public GameObject target;

    private Vector3 nowPosition;

    private Vector3 offersPosition;

    public Vector3 targetEndPosition;

    /// <summary>
    /// 当前距离
    /// </summary>
    protected float currentDistance;
    /// <summary>
    /// 目标距离
    /// </summary>
    protected float targetDistance;
    Vector3 targetOffset;
    [Range(0, 3)]
    public float zoomDamp = 3;
    private float ratateSpeed = 5.0f;
    private void Start()
    {
        target = GameObject.FindGameObjectWithTag("Player");
        nowPosition = transform.position;
        targetEndPosition = target.transform.position;
        var qua = Quaternion.LookRotation(target.transform.position - transform.position);
        var euler = qua.eulerAngles;
        euler.x = 0;
        euler.z = 0;
        euler.y = nowPosition.y;
        qua = Quaternion.Euler(euler);
        transform.rotation = Quaternion.Lerp(transform.rotation, qua, 0.5f);
        //transform.LookAt(target.transform.position);

        offersPosition = transform.position - target.transform.position;
        //求摄像机和目标点之间的距离
        targetDistance = currentDistance = Vector3.Distance(target.transform.position, transform.position);
    
}
    private void Update()
    {
        Gesture gesture = EasyTouch.current;
        Vector2 gestureStartPos = gesture.startPosition;

        Vector2 gestureEndPos = gesture.position;
       
        if (gesture != null&&gesture.position.x>Screen.width/2)
        {
            Debug.Log("ges" + gesture.position.x + "pinmu" + Screen.width / 2);
            if (gesture.swipe == EasyTouch.SwipeDirection.Right || gesture.swipe == EasyTouch.SwipeDirection.Left)
            {
                Debug.Log("000");
                OnSwipeRight(gesture);
            }
        }
    }
    Quaternion qua;
    private void LateUpdate()
    {
        //   transform.position = offersPosition + target.transform.position;
        transform.position = target.transform.position - transform.forward * currentDistance+new Vector3(0,2,0);
    }

    private void OnSwipeRight(Gesture gesture)
    {
        int nun = 1;
        if (gesture.swipe == EasyTouch.SwipeDirection.Right)
        {
            nun = 1;
        }
        if (gesture.swipe == EasyTouch.SwipeDirection.Left)
        {
            nun = -1;
        }

      
        transform.RotateAround(target.transform.position, target.transform.up, gesture.position.x * nun * Time.deltaTime);
        
        target.transform.RotateAround(target.transform.position, target.transform.up, gesture.position.x * nun * Time.deltaTime);
        //nowPosition.x = transform.position.x;
        //nowPosition.z = transform.position.z;
        //offersPosition =nowPosition - target.transform.position;
        currentDistance = Mathf.Lerp(currentDistance, targetDistance, zoomDamp);

    }


}

在Unity中实现摄像机跟随主角的功能,有多种方法可以选择,以下是几种常见的实现方式: ### 使用脚本实现摄像机跟随 1. **使用`FollowTarget`脚本**: 创建一个名为`FollowTarget`的脚本并将其挂载到摄像机上。该脚本通过计算摄像机与玩家之间的偏移量,并在每一帧更新摄像机的位置以平滑地跟随玩家。 ```csharp using UnityEngine; public class FollowTarget : MonoBehaviour { public GameObject player; private Vector3 offset; private float smoothing = 3; void Start() { offset = transform.position - player.transform.position; } void LateUpdate() { Vector3 targetPosition = player.transform.position + offset; transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * smoothing); transform.LookAt(player.transform.position); } } ``` 2. **使用`CameraFollow`脚本**: 创建一个名为`CameraFollow`的脚本并将其挂载到摄像机上。该脚本通过计算摄像机的目标位置,并使用`Vector3.Lerp`函数实现平滑移动。 ```csharp using UnityEngine; public class CameraFollow : MonoBehaviour { public Transform target; public float smoothSpeed = 0.125f; public Vector3 offset; void LateUpdate() { Vector3 desiredPosition = target.position + offset; Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); transform.position = smoothedPosition; } } ``` ### 使用Unity的Cinemachine插件 3. **使用Cinemachine虚拟摄像机**: Unity的Cinemachine插件提供了一个强大的虚拟摄像机系统,可以轻松实现摄像机跟随功能。创建一个虚拟摄像机并将其绑定到主角上,然后调整虚拟摄像机跟随点和距离,即可实现摄像机跟随效果[^3]。 - 创建一个空物体作为跟随点,并将其绑定到主角上。 - 调整空物体的位置以确定摄像机跟随高度和角度。 - 将空物体绑定到虚拟摄像机的Follow目标上。 - 调整虚拟摄像机的X、Y、Z轴和相机距离参数以获得理想的跟随效果。 这些方法可以根据具体需求选择使用,简单的脚本实现适合快速开发,而Cinemachine插件则提供了更高级的功能和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GAME LIAO

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值