Unity实现相机跟随

举报
心疼你的一切 发表于 2024/12/17 10:53:37 2024/12/17
【摘要】 实现相机跟随代码

一、简单的跟随目标位置移动(跟随 2D 或 3D 物体)

1. 创建脚本

在 Unity 中创建一个新的 C# 脚本,命名为 CameraFollow.cs,然后将其挂载到场景中的主摄像机上。新建cube设置为target

2. 代码内容如下

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target;  // 要跟随的目标物体的Transform组件
    public float smoothSpeed = 0.125f;  // 跟随的平滑速度

    private Vector3 offset;  // 相机与目标之间的初始偏移量

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

    void FixedUpdate()
    {
        // 计算目标的期望位置
        Vector3 desiredPosition = target.position + offset;

        // 使用平滑插值来平滑相机的移动
        Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);

        transform.position = smoothedPosition;
    }
}

 FixedUpdate 方法(一般用于处理物理相关或需要稳定更新频率的操作)中,先根据目标物体当前位置和偏移量计算出相机期望达到的位置(desiredPosition)。然后,使用 Vector3.Lerp(线性插值)函数,按照设定的 smoothSpeed 平滑速度,将相机当前位置逐步过渡到期望位置,实现了相对平滑的跟随效果。

二、跟随目标且看向目标(常用于 3D 场景)

1. 创建脚本

同样创建 CameraFollow3D.cs 脚本挂载到摄像机上。

2. 代码如下

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

public class CameraFollow3D : MonoBehaviour
{
    public Transform target;
    public float smoothSpeed = 0.125f;
    public float distance = 5f;  // 相机与目标的距离
    public float height = 2f;  // 相机相对目标的高度

    void FixedUpdate()
    {
        // 计算相机的目标位置
        Vector3 targetPosition = target.position;
        targetPosition -= target.forward * distance;
        targetPosition.y += height;

        // 平滑移动相机到目标位置
        Vector3 smoothedPosition = Vector3.Lerp(transform.position, targetPosition, smoothSpeed);
        transform.position = smoothedPosition;

        // 让相机看向目标
        transform.LookAt(target);
    }
}

通过 transform.LookAt(target) 语句,让相机的朝向始终对准目标物体,这样可以实现更符合观察逻辑的跟随效果,尤其适用于第三人称视角等 3D 场景的相机控制。

三、限制相机跟随范围(例如在游戏场景边界内跟随)

1. 创建脚本

创建 CameraFollowWithBounds.cs 脚本挂载到摄像机上。

2. 代码示例

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

public class CameraFollowWithBounds : MonoBehaviour
{
    public Transform target;
    public float smoothSpeed = 0.125f;
    public float xMin;  // X轴最小坐标限制
    public float xMax;  // X轴最大坐标限制
    public float yMin;  // Y轴最小坐标限制
    public float yMax;  // Y轴最大坐标限制

    private Vector3 offset;

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

    void FixedUpdate()
    {
        Vector3 targetPosition = target.position + offset;

        // 限制X轴坐标范围
        targetPosition.x = Mathf.Clamp(targetPosition.x, xMin, xMax);

        // 限制Y轴坐标范围
        targetPosition.y = Mathf.Clamp(targetPosition.y, yMin, yMax);

        Vector3 smoothedPosition = Vector3.Lerp(transform.position, targetPosition, smoothSpeed);
        transform.position = smoothedPosition;
    }
}

通过 Mathf.Clamp 函数分别对 X 轴和 Y 轴的坐标进行限制,使其只能在预先设定的 xMinxMaxyMinyMax 范围内变动,防止相机跟随到场景之外或者超出期望的观察区域

根据具体的游戏场景特点和需求,对这些代码示例进行修改完善,比如调整平滑速度、距离、坐标限制等参数,以达到理想的相机跟随效果

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。