Unity2023.1中Cinemachine报错无法使用:'FindObjectsByType'不存在于当前上下文
解决Unity 2023.1.0a19中Cinemachine 2.9.5的编译错误问题
问题现象
在Unity 2023.1.0a19(Alpha版本)中创建新项目后,通过Package Manager安装Cinemachine 2.9.5会触发以下编译错误:
Library\PackageCache\com.unity.cinemachine@2.9.5\Runtime\Core\CinemachineVirtualCameraBase.cs:FindObjectsByType、FindObjectsInactive、FindObjectsSortMode不存在于当前上下文Library\PackageCache\com.unity.cinemachine@2.9.5\Editor\Menus\CinemachineMenu.cs:Object不包含FindFirstObjectByType的定义
错误根源是Cinemachine 2.9.5针对UNITY_2023_1_OR_NEWER分支使用了Unity 2023.x的新对象查找API,但Unity 2023.1.0a19作为早期Alpha版本,这些API尚未完全实装或命名规则未定型。直接修改Package Cache内的代码会被系统自动重置,无法持久解决问题。
解决方案
1. 升级Unity到2023.1正式版/后期Beta版本
Unity Alpha版本存在API不稳定、功能未完全实现的特性,FindObjectsByType等新API是在2023.1的后续版本中正式引入的。升级到2023.1的正式版或较新Beta版本,即可直接兼容Cinemachine 2.9.5的API调用。
2. 降级Cinemachine到兼容版本
在Package Manager中找到Cinemachine,点击右侧⋮菜单选择Install specific version,尝试降级到2.9.0或更早版本——这些版本尚未使用2023.x的新查找API,可直接适配Unity 2023.1.0a19。
3. 将Cinemachine转为本地包并修改代码(持久化修复)
若必须同时使用Cinemachine 2.9.5和当前Unity Alpha版本,可将包转为本地包避免系统重置:
- 打开Package Manager,找到Cinemachine,点击
⋮→Show in Explorer,复制整个com.unity.cinemachine@2.9.5文件夹到项目的Packages目录下 - 修改
CinemachineVirtualCameraBase.cs中的域重载代码:#if UNITY_EDITOR [UnityEditor.InitializeOnLoad] class OnDomainReload { static OnDomainReload() { #if UNITY_2023_1_OR_NEWER && !UNITY_2023_1_ALPHA var vcams = FindObjectsByType<CinemachineVirtualCameraBase> (FindObjectsInactive.Include, FindObjectsSortMode.None); #elif UNITY_2020_1_OR_NEWER var vcams = FindObjectsOfType<CinemachineVirtualCameraBase>(true); #else var vcams = FindObjectsOfType<CinemachineVirtualCameraBase>(); #endif foreach (var vcam in vcams) vcam.InvalidateCachedTargets(); } } #endif - 修改
CinemachineMenu.cs中的相机查找代码:
通过添加if (cam == null) #if UNITY_2023_1_OR_NEWER && !UNITY_2023_1_ALPHA cam = Object.FindFirstObjectByType<Camera>(FindObjectsInactive.Exclude); #else cam = Object.FindObjectOfType<Camera>(); #endif!UNITY_2023_1_ALPHA条件,让Alpha版本自动回退到兼容的旧API。
4. 临时注释报错代码(仅测试用)
如果只是临时测试,可直接注释掉Cinemachine中报错的2023.x分支代码,强制使用兼容版本的FindObjectsOfType调用,但注意每次Package更新后需重新操作,不适合长期项目。
内容的提问来源于stack exchange,提问作者MioSleet
相关产品推荐
相关产品推荐

