首页 > 其他分享 >Unity引擎2D游戏开发,摄像机跟随及攻击抖动实现

Unity引擎2D游戏开发,摄像机跟随及攻击抖动实现

时间:2023-12-30 23:33:58浏览次数:44  
标签:摄像机 场景 void private 2D Unity 添加

安装摄像机插件

打开Package Manager,输入Cinemachine进行搜索安装
image

导入摄像机

在Hierarchy窗口中,添加2D Camera
image

image
会发现Game窗口没有任何东西,因为该摄像机并没有进行跟随、观看等相关的设置
image

将Player拖进FollowLook At,并将Lens Ortho Size设置为6
image

此时Game窗口聚焦到了Player身上
image

设置摄像机

Body中,能够看到有非常多的摄像机设置
image

Tracked Object Off X:能够调整摄像机中心点的偏移值
image

Lookahead Time:根据目标的运动方向调整摄像机的位移,数值越高,位移强度越高
Lookahead Smoothing:位移缓冲值,数值越高,缓冲强度越高

X、Y、Z Damping:摄像机跟随某坐标轴的阻尼强度,数值越高,阻尼强度越高,跟随速度越慢

Screen X、Y:摄像机物理偏移量

Dead Zone Width、Height、Depth:死区大小,人物在死区内移动,并不会带动摄像机移动,除非走出死区

Soft Zone Width、Height:软区大小,当人物位于软区时,人物移动后,摄像机会逐渐跟随对准中心,形成一种拖拽感
Bias X、Y:软区位置偏移量

解决摄像机画幅超出地图范围的问题

有一个Add Extension选项,它能够添加摄像机的额外插件
image

添加Cinemachine Pixel Perfect插件,它能够在像素旋转、畸变等情况时,不会产生像素扭曲,会一直保持单位像素原有的形态
image

再添加Cinemachine Confiner 2D,它能够限定摄像机的移动范围。其中的Bounding Shape 2D变量,可以通过新建一个作用于整个游戏场景的Collider 2D,来限制摄像机的移动范围
image

新建Empty Object,添加Polygon Collider 2D。将Collider勾选上Is Trigger,否则会将场景中的对象发生碰撞
image

将此Collider调整到合适的大小
image

将Collider拖入Bounding Shape 2D,即可实现该功能
image

除此之外,可以通过移除多余的点,来让Colider形成一个矩形,能够更方便的调整区域的大小
image

切换场景时,获取当前场景的摄像机边界

思路:
让Virtual Camera获取Cinemachine Confiner 2D组件,在当切换场景时,去找被标记为Bounds的这个物件,将Collider赋予给Bounding Shape 2D变量

为Bounds添加一个Tag,命名为Bounds
image

Scripts下,创建C#文件,命名为CameraControl
image

将其挂载到Virtual Camera
image

创建CinemachineConfiner2D的全局变量,并初始化

private CinemachineConfiner2D confiner2D;

private void Awake()
{
    confiner2D = GetComponent<CinemachineConfiner2D>();
}

编写GetNewCameraBounds()方法,在内部获取Tag为Bounds的GameObject,将其中的Collider2D赋予给CinemachineConfiner2D

private void GetNewCameraBounds()
{
    var obj = GameObject.FindGameObjectWithTag("Bounds");
    if (null == obj)
    {
        return;
    }
    confiner2D.m_BoundingShape2D = obj.GetComponent<Collider2D>();
}

回到Cinemachine Confiner 2D中,能够看到下方有一个按钮Invalidate Cache,它能够在场景切换后,对场景边界清除缓存,防止上一次的场景影响当前更换后的场景
image

因此,在该方法最后添加一行代码来清除缓存

private void GetNewCameraBounds()
{
    var obj = GameObject.FindGameObjectWithTag("Bounds");
    if (null == obj)
    {
        return;
    }
    confiner2D.m_BoundingShape2D = obj.GetComponent<Collider2D>();
    // 清除边界缓存
    confiner2D.InvalidateCache();
}

暂时在Start()方法中进行调用

// TODO:场景切换后更改
private void Start()
{
    GetNewCameraBounds();
}

摄像机震动

添加Cinemachine Impulse Listener,监听发生的脉冲
image
该组件将可以响应CinemachineImpulseSource脉冲来源发出的任何脉冲信号

勾选Use 2D Distance,由于Unity默认的是3D场景,那么该组件的脉冲方向也是3D的,但当前项目是2D,因此勾选上此设置
image

创建新的GameObject,命名为Camera Shake。并添加Cinemachine Impulse Source组件
image
Impulse Shape能够选择不同的震动方式,DefaultVelocity能够处理不同坐标轴的震动力度大小

CameraControl脚本内,创建CinemachineImpulseSource的全局变量

public CinemachineImpulseSource impulseSource;

Virtual Camera拖入到此变量内
image

现在无论当玩家还是敌人受伤,都去执行GenerateImpulse()脉冲执行的方法。那么就利用事件监听的方法去调用此方法

创建新的ScriptableObjectC#脚本,命名为VoidEventSO
image

由于不需要传递任何的参数,因此写上基础的Event代码

[CreateAssetMenu(menuName = "Event/VoidEventSO")]
public class VoidEventSO : ScriptableObject
{
    public UnityAction OnEventRaised;

    public void RaiseEvent()
    {
        OnEventRaised?.Invoke();
    }
}

Event文件夹下,创建刚才创建的Scriptable Object,命名为CameraShakeEvent
image

在Player的Character中,在On Take Damage内拖入上述的Scriptable Object,选择RaiseEvent()方法
image

CameraControl中,添加VoidEventSO的全局变量

public VoidEventSO cameraShakeEvent;

添加OnEnable()OnDisable()OnCameraShakeEvent()方法来注册摄像机震动的事件

private void OnEnable()
{
    cameraShakeEvent.OnEventRaised += OnCameraShakeEvent;
}

private void OnDisable()
{
    cameraShakeEvent.OnEventRaised -= OnCameraShakeEvent;
}

private void OnCameraShakeEvent()
{
    impulseSource.GenerateImpulse();
}

标签:摄像机,场景,void,private,2D,Unity,添加
From: https://www.cnblogs.com/xinlindeyu/p/17937053

相关文章

  • Unity引擎2D游戏开发,血量更新逻辑的实现
    思路能够发现FillAmount就是控制血量条长度的控件,它是一个百分比值,则可以通过当前血量除以最大血量得到当前血量的百分比。那么,也就能控制血量条的长度了。编写基本的更新逻辑创建C#文件将C#文件挂载到PlayerStateBar上在C#文件中调用UI组件前,需要调用UI组件库usingU......
  • Unity引擎2D游戏开发,UI绘制创建人物状态栏
    下载并导入UI资源前往UnityAssetsStore中下载添加此资源打开Unity中的PackageManager,选择MyAssets,点击Import导入项目中取消选择Scene,其他的全都勾选上,然后点击Import然后在Assets文件夹下方会出现MStudio文件夹,此处就是插件的目录打开ColorPalette,能够看到不同前......
  • mac m1 编译cocos2d-x 在模拟器上运行 一些问题汇总
     如果涉及到侵权请联系本人删除 1  》〉/Users/yzfhkms-m/Library/Developer/Xcode/DerivedData/formi-dlcfwgxcmidqefdkxnvnfwfprpfs/Build/Products/Debug-iphonesimulator/formi-mobile.appisnotavalidpathtoanexecutablefile.Pleaserebuildtheprojectto......
  • 【Unity百宝箱】游戏中的观察者模式
    【Unity百宝箱】游戏中的观察者模式原创 打工人小棋 打工人小棋 2023-04-2713:35 发表于广东Hi,大家好,我是游戏区“bug主”打工人小棋! 今天我想和大家聊一聊游戏中的观察者模式~近两期视频,都是在为下一期视频做准备,在下期视频中,大家将会看到用户数据存储、以......
  • 【Unity百宝箱】游戏中的用户数据存档
    【Unity百宝箱】游戏中的用户数据存档原创 打工人小棋 打工人小棋 2023-04-1700:04 发表于广东Hi大家好,我是游戏区Bug打工人小棋。在游戏开发过程中,我们经常有存储用户数据的这一需求,比方说:游戏音量、关卡进度、任务进度等等。在联网游戏中,往往会把一些用户核心......
  • 【泰裤辣 の Unity百宝箱】Canvas组件四件套讲解
    【泰裤辣のUnity百宝箱】Canvas组件四件套讲解原创 打工人小棋 打工人小棋 2023-05-1613:24 发表于广东1.介绍在上一期内容中,我分享了一套简单易用的UI框架。没想到大家的学习热情这么高,讨论度是目前所有内容最高的。由此可见,天下苦UI(秦)久已!!!接下去,我们继续......
  • Unity解析key不确定的Json
    遇到Json的key不固定时,只需要解析value,如下Jsondata下的key(1和2)是变化的:{"status":1,"msg":"success","data":["1:":{"atitle":"test",......
  • Unity_U_OP1 ScriptableObject 替代单例
    核心思想:解耦GameManager单例模式,不再由一个单例管理所有事件触发,拆分成无数个小单例,各自管理优点:更加灵活的事件管理模式复用性高,对于相关类型的事件,只需要写一遍代码,剩下的拖拖拖就可以实现相同的功能。缺点:管理起来相对麻烦不利于维护,除非对这个系统非常了解,要不然排......
  • Maya与Unity模型尺度统一
    Maya与Unity模型尺度统一Maya建模默认使用的单位是cm,Unity使用的是m,有时候可能需要把Maya中建好的模型导入到Unity中,因此这篇文章介绍如何修改Maya的默认建模单位,从而使得二者的尺度统一。进入窗口,设置,首选项。修改为m......
  • 本安型光纤收发器 矿用防爆摄像机收发器 转换器 支持5-24V
    · 2个100M光口,3个10/100M自适应RG45以太网电口· 支持IEEE802.3u标准,支持全双工/半双工,MDI/MDI-X自动侦测· 宽温设计,工作温度-30℃~75℃,相对湿度5~95%,适应恶劣的工业环境· EMC防护,,短路保护,反接保护,浪涌保护· 本安型防爆,应用广泛,可应用于煤矿或防爆摄像头等等· 支持电源、......