[Unity]cinemachine confiner动态改变边界
发布日期:2021-05-09 11:43:02 浏览次数:29 分类:精选文章

本文共 2695 字,大约阅读时间需要 8 分钟。

当动态修改Cinemachine Confiner的边界Bounding Shape 2D时,可能会出现BUG。具体表现为,在运行场景前修改了Points数组的值,但在运行场景后,Cinemachine Confiner仍然使用了初始的数组值作为边界。

为了解决这个问题,尝试将另一个具有Polygon Collider 2D组件且设置为Is Trigger为False的物体设置为Cinemachine Confiner的Bounding Shape 2D。这样可以观察到边界是否随之发生变化。

以下是尝试的代码片段:

using UnityEngine;using Cinemachine;public class CameraManager : MonoBehaviour{    [SerializeField] private Transform transform;    [SerializeField] private CinemachineVirtualCamera camera;    [SerializeField] private CinemachineConfiner cinemachineConfiner;    [SerializeField] private PolygonCollider2D polygonCollider;    [SerializeField] private PolygonCollider2D polygonCollider1;    [SerializeField] private int num = 1;    public static CameraManager instance;    void Awake()    {        instance = this;    }    void Start()    {        changeBound();    }    public void changeBound()    {        if (cinemachineConfiner != null && polygonCollider1 != null && polygonCollider != null             && transform != null && camera != null)        {            CinemachineConfiner confiner = new CinemachineConfiner();            Debug.Log("changeBound() - Setting cinemachineConfiner.m_BoundingShape2D to polygonCollider");            cinemachineConfiner.m_Damping = 0f;            cinemachineConfiner.InvalidatePathCache();            if ((num % 2) != 0)            {                cinemachineConfiner.m_BoundingShape2D = null;                confiner.m_BoundingShape2D = polygonCollider1;                //camera.AddExtension(confiner);                //transform.gameObject.AddComponent
(); //cinemachineConfiner = transform.GetComponent
(); //cinemachineConfiner = confiner; //cinemachineConfiner.InvalidatePathCache(); //cinemachineConfiner.m_BoundingShape2D = polygonCollider1; } else if ((num % 2) == 0) { cinemachineConfiner.m_BoundingShape2D = null; confiner.m_BoundingShape2D = polygonCollider; //camera.AddExtension(confiner); //transform.gameObject.AddComponent
(); //cinemachineConfiner = transform.GetComponent
(); //cinemachineConfiner = confiner; //cinemachineConfiner.InvalidatePathCache(); //cinemachineConfiner.m_BoundingShape2D = polygonCollider; } cinemachineConfiner.m_BoundingShape2D = confiner.m_BoundingShape2D; num++; } }}

注意事项:

  • 在分支中使用Destroy()可能会导致组件丢失,建议谨慎使用。
  • 确保Cinemachine Confiner组件已正确添加到物体上。
  • Bounding Shape 2D的更新逻辑可能需要进一步优化,确保正确生效。
  • 通过以上方法,可以更好地控制Cinemachine Confiner的边界,并解决更新不正确的问题。

    上一篇:[Unity][AssetBundle]打包一个文件夹并读取AB包中不同的同名文件
    下一篇:[C#]什么时候使用协程函数

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年05月15日 05时10分16秒