相机俯视角跟随(可根据遮挡调整相机)

该脚本用于实现Unity3D游戏中相机对角色的跟随,结合Lerp函数平滑过渡相机位置,同时使用Raycast检查相机视角是否能看见角色,确保相机始终保持在角色可视范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

脚本挂载至相机上 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMovement : MonoBehaviour
{
    public float smooth = 1.5f;

    private Transform player;//角色
    private Vector3 relCameraPos;
    private float relCameraPosMsg;
    private Vector3 newPos;

    private void Awake()
    {
        player = GameObject.FindGameObjectWithTag(tag.player).transform;
        //角色到相机的向量
        relCameraPos = transform.position - player.position;
        //向量长度
        relCameraPosMsg = relCameraPos.magnitude - 0.5f;
    }

    private void FixedUpdate()
    {
        //相机的初始位置=角色位置+相机到角色的相对位置
        Vector3 standardPos = player.position + relCameraPos;

        //相机俯视角位置=角色位置+角色正上方*相对位置的向量长度
        Vector3 abovePos = player.position + Vector3.up * relCameraPosMsg;

        //存储相机初始位置到正上方位置lerp中的插值[ 0 , 0.25f , 0.5f , 0.75f , 1]
        Vector3[] checkPoints = new Vector3[5];
        checkPoints[0] = standardPos;
        checkPoints[1] = Vector3.Lerp(standardPos, abovePos, 0.25f);//位置在0.25位置的时候
        checkPoints[2] = Vector3.Lerp(standardPos, abovePos, 0.5f);
        checkPoints[3] = Vector3.Lerp(standardPos, abovePos, 0.75f);
        checkPoints[4] = abovePos;

        for (int i = 0; i < checkPoints.Length; i++)
        {
            if (ViewingPosCheck(checkPoints[i]))
            {
                break;
            }
        }
        transform.position = Vector3.Lerp(transform.position, newPos, smooth * Time.deltaTime) ;
        SmoothLookAt();
    }

    /// <summary>
    /// Camera根据checkPoints集合中各分段的位置值投射一条长度relCameraPosMsg的射线,如果可以射到player,那么就不继续遍历checkPoints
    /// </summary>
    /// <param name="checkPos"></param>
    /// <returns></returns>
    bool ViewingPosCheck(Vector3 checkPos )
    {
        RaycastHit Hit;
        if (Physics.Raycast(checkPos,player.position-checkPos,out Hit,relCameraPosMsg))
        {
            if (Hit.transform!=player)
            {
                return false;
            }
        }
        newPos = checkPos;
        return true;

    }

    /// <summary>
    /// 让相机平滑至目标角度
    /// </summary>
    void SmoothLookAt()
    {
        Vector3 relPlayerPositon = player.position - transform.position;
        Quaternion lookAtRotation = Quaternion.LookRotation(relPlayerPositon,Vector3.up);
        transform.rotation = Quaternion.Lerp(transform.rotation,lookAtRotation,smooth*Time.deltaTime);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值