问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

游戏开发入门:实现摄像机跟随系统

创作时间:
2025-03-13 10:48:04
作者:
@小白创作中心

游戏开发入门:实现摄像机跟随系统

引用
CSDN
1.
https://m.blog.csdn.net/qq_63671405/article/details/143515421

本文将介绍如何在游戏中实现摄像机跟随系统,包括使用Cinemachine插件和自定义脚本两种方式。通过调整阻尼、死区、边界限制等参数,可以实现平滑且可控的摄像机跟随效果。

使用Cinemachine插件实现摄像机跟随

准备工作

首先需要在Unity中安装Cinemachine插件:

  1. 打开Unity编辑器,进入Window > Package Manager
  2. 在Unity Registry中找到Cinemachine并点击Install

安装完成后,在Hierarchy面板中创建一个Virtual Camera:

  1. 右键点击Hierarchy面板
  2. 选择Cinemachine > 2D Camera

设置Virtual Camera的跟随对象:

平滑跟随

通过调整CinemachineVirtualCamera组件中的Body列表下的X DampingY Damping属性,可以控制虚拟摄像机的移动阻尼:

  • X Damping:虚拟摄像机在X轴的响应,数值越大反应越慢
  • Y Damping:虚拟摄像机在Y轴的响应,数值越大反应越慢
  • 当两个值都为0时,摄像机进行实时跟随

具有死区的跟随

为了防止摄像机在小幅度移动时影响玩家校准,可以设置死区范围:

  • Dead Zone Width:水平方向的死区宽度
  • Dead Zone Height:垂直方向的死区高度

死区指的是跟随目标在该区域以内时,虚拟摄像机不会进行跟随:

有边界限制的跟随

当玩家移动到地图边界时,可以通过添加边界限制来防止摄像机超出地图范围:

  1. 点击CinemachineVirtualCamera组件中的Extensions列表下的Add Extension,选择Cinemachine Confiner 2D
  2. 在Hierarchy面板中创建一个Empty Game Object(例如命名为Border)
  3. 为Border添加Polygon Collider 2D组件并绘制地图边界,设置为触发器
  4. 将Border拖入Cinemachine Confiner 2D组件中的Bounding Shape 2D属性中

单向不可逆跟随

在追逐战等场景中,可以设计单向跟随:

  1. 水平方向单向跟随:调整Screen XScreen YDead Zone WidthDead Zone Height属性,使摄像机只在水平方向向右跟随
  2. 垂直方向单向跟随:调整相关属性,使摄像机只在垂直方向向上跟随

摄像机晃动

可以通过创建噪声文件资产或使用插件自带的噪声文件来实现摄像机晃动效果:

  1. 创建噪声配置文件资产:
  • Assets > Create > Cinemachine > NoisesSettings
  • Position Noise中设置频率和振幅

  1. 应用噪声配置文件:
  • CinemachineVirtualCamera组件中选择Noise属性为Basic Multi Channel Perlin
  • 选择自己的噪声配置文件资产

插件自带的噪声文件资产包括多种预设效果,如手持摄像机晃动等。

使用脚本实现摄像机跟随

创建变量

新建CameraController脚本并创建相关变量:

[Tooltip("摄像机跟随目标")]
public Transform target;
[Tooltip("摄像机跟随平滑度")]
[Range(0f, 1f)] public float smoothTime;
[Tooltip("摄像机跟随偏移")]
public Vector3 positionOffset;
[Space]
[Header("轴限制")]
[Tooltip("X轴限制")]
public Vector2 xLimit;
[Tooltip("y轴限制")]
public Vector2 yLimit;
private Vector3 velocity;

摄像机跟随

LateUpdate()FixedUpdate()中实现摄像机跟随:

  1. 获取目标位置并进行边界限制
  2. 使用Vector3.SmoothDamp()实现平滑移动
Vector3 targetPosition = target.position + positionOffset;
targetPosition = new Vector3(Mathf.Clamp(targetPosition.x, xLimit.x, xLimit.y), Mathf.Clamp(targetPosition.y, yLimit.x, yLimit.y), -10);
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);

完整代码

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

public class CameraController : MonoBehaviour
{
    [Tooltip("摄像机跟随目标")]
    public Transform target;
    [Tooltip("摄像机跟随平滑度")]
    [Range(0f, 1f)] public float smoothTime;
    [Tooltip("摄像机跟随偏移")]
    public Vector3 positionOffset;
    [Space]
    [Header("轴限制")]
    [Tooltip("X轴限制")]
    public Vector2 xLimit;
    [Tooltip("y轴限制")]
    public Vector2 yLimit;
    private Vector3 velocity;

    private void Start()
    {
        velocity = Vector3.zero;
    }

    private void FixedUpdate()
    {
        Vector3 targetPosition = target.position + positionOffset;
        targetPosition = new Vector3(Mathf.Clamp(targetPosition.x, xLimit.x, xLimit.y), Mathf.Clamp(targetPosition.y, yLimit.x, yLimit.y), -10);
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
    }
}

通过以上方法,可以实现多种不同需求的摄像机跟随效果,提升游戏体验。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号