游戏开发入门:实现摄像机跟随系统
创作时间:
作者:
@小白创作中心
游戏开发入门:实现摄像机跟随系统
引用
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);
}
}
通过以上方法,可以实现多种不同需求的摄像机跟随效果,提升游戏体验。
热门推荐
大学选修课如何才能受追捧?感兴趣的看过来——
三明医改:中国医疗改革的破冰之旅
房贷利率应该选固定还是浮动?这些购房注意事项要知道
美国房贷利率逼近7% 购房成本飙升 房市新挑战
大货车、半挂车、卡车盲区详解及防范措施,提升行车安全
云计算技术基础知识,解密云计算的核心概念与应用
2025年:揭秘抑郁症药物治疗的神奇密码!
明朝历代帝王顺序表及在位时间(附谱系图)
园区AR导航系统:技术创新与功能拓展
二手车里程表被“动手脚”?法院这样判!如何识别?一文了解
如何利用开源软件减少成本
避暑山庄:一片静谧与清凉的仙境
盐碱地里养出“海味”来
天盘地盘人盘图解:八字命理与周易哲学的基础
辰丑相破如何化解
冬至大如年!10首经典冬至诗词等你来邂逅
数据分析的流程怎么样才能更精准
如何应用风险管理与保险原理提升企业竞争力?
什么是衍生品交易以及有哪些风险?这些风险如何进行管理?
石墨烯航空电池助力低空经济“高飞”
用Excel做模型预测:从入门到精通
惠州龙门县旅游攻略:自然人文双绝,山水温泉共赏
归妹卦在事业中的启示
事故起诉对方保险公司:法律依据与实务操作指南
归妹卦在事业中的启示
专家解答:老年人能否进行心脏射频消融手术?
如何删除微信备份照片
为什么手臂很粗?原因分析与改善建议
离异后孩子随母亲,子女是否能继承父亲财产
手臂越来越粗是什么原因造成的