游戏开发入门:实现摄像机跟随系统
创作时间:
2025-03-13 10:48:04
作者:
@小白创作中心
游戏开发入门:实现摄像机跟随系统
引用
CSDN
1.
https://m.blog.csdn.net/qq_63671405/article/details/143515421
本文将介绍如何在游戏中实现摄像机跟随系统,包括使用Cinemachine插件和自定义脚本两种方式。通过调整阻尼、死区、边界限制等参数,可以实现平滑且可控的摄像机跟随效果。
使用Cinemachine插件实现摄像机跟随
准备工作
首先需要在Unity中安装Cinemachine插件:
- 打开Unity编辑器,进入
Window > Package Manager
- 在Unity Registry中找到Cinemachine并点击Install
安装完成后,在Hierarchy面板中创建一个Virtual Camera:
- 右键点击Hierarchy面板
- 选择
Cinemachine > 2D Camera
设置Virtual Camera的跟随对象:
平滑跟随
通过调整CinemachineVirtualCamera
组件中的Body
列表下的X Damping
和Y Damping
属性,可以控制虚拟摄像机的移动阻尼:
X Damping
:虚拟摄像机在X轴的响应,数值越大反应越慢Y Damping
:虚拟摄像机在Y轴的响应,数值越大反应越慢- 当两个值都为0时,摄像机进行实时跟随
具有死区的跟随
为了防止摄像机在小幅度移动时影响玩家校准,可以设置死区范围:
Dead Zone Width
:水平方向的死区宽度Dead Zone Height
:垂直方向的死区高度
死区指的是跟随目标在该区域以内时,虚拟摄像机不会进行跟随:
有边界限制的跟随
当玩家移动到地图边界时,可以通过添加边界限制来防止摄像机超出地图范围:
- 点击
CinemachineVirtualCamera
组件中的Extensions
列表下的Add Extension
,选择Cinemachine Confiner 2D
- 在Hierarchy面板中创建一个Empty Game Object(例如命名为Border)
- 为Border添加
Polygon Collider 2D
组件并绘制地图边界,设置为触发器 - 将Border拖入
Cinemachine Confiner 2D
组件中的Bounding Shape 2D
属性中
单向不可逆跟随
在追逐战等场景中,可以设计单向跟随:
- 水平方向单向跟随:调整
Screen X
、Screen Y
、Dead Zone Width
和Dead Zone Height
属性,使摄像机只在水平方向向右跟随 - 垂直方向单向跟随:调整相关属性,使摄像机只在垂直方向向上跟随
摄像机晃动
可以通过创建噪声文件资产或使用插件自带的噪声文件来实现摄像机晃动效果:
- 创建噪声配置文件资产:
Assets > Create > Cinemachine > NoisesSettings
- 在
Position Noise
中设置频率和振幅
- 应用噪声配置文件:
- 在
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()
中实现摄像机跟随:
- 获取目标位置并进行边界限制
- 使用
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);
}
}
通过以上方法,可以实现多种不同需求的摄像机跟随效果,提升游戏体验。
热门推荐
福州春节旅游爆棚,你准备好了吗?
《和平精英》新春荣都版本前瞻:8km新地图、多种武器载具更新来袭
纽约、加州、德州、佛州:谁的文化更吸引你?
苹果虽好,但这些情况要当心!
车票售罄莫慌张,候补购票成功率更高
12306推出候补购票功能,成功率可达75%
汕头文旅局公布最新精品路线,串起“六区一县”特色景点
周末双人开黑,《和平精英》带你飞!
春运大站里的“时代图景”
太岁神崇拜:时间与宇宙秩序的守护者
玉皇大帝生日,揭秘太岁星君的秘密
手机静音了怎么办?这些快捷方法让你告别尴尬时刻
《滕王阁序》:王勃的天才之作与盛唐气象
李雄攻占成都:一座千年古城的文化传奇
品鲁锦底蕴,开展线上查阅活动
《读者文摘》揭秘:苹果的养生秘密与食用指南
“苹果减肥法”真的有效吗?专家解读来了
冬季养生,苹果这样吃最健康
交管12123使用指南:7项交管业务手机轻松办
又上新了!哈尔滨推出两条不可移动文物主题游线路
舟山到杭州自驾游攻略:打卡普陀山和西湖
舟山到杭州自驾游打卡圣地
巴蜀图语:成汉文化的神秘符号
成汉政权:从初期繁荣到快速衰亡
高端家具品牌营销策略:从品牌定位到数字化转型
潘爱君:基层卫生院的“守护神”
麦卢卡蜂蜜:抗氧化界的超级英雄
蜂蜜:自然界的超级食物,健康生活的秘密武器
蜂蜜+柠檬,冬季养生CP出道啦!
麦卢卡蜂蜜:医学界的超级英雄?