
[Unity]cinemachine confiner动态改变边界
在分支中使用Destroy()可能会导致组件丢失,建议谨慎使用。 确保Cinemachine Confiner组件已正确添加到物体上。 Bounding Shape 2D的更新逻辑可能需要进一步优化,确保正确生效。
发布日期: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++; } }}
注意事项:
通过以上方法,可以更好地控制Cinemachine Confiner的边界,并解决更新不正确的问题。