我正在制作一個 ScriptableObject 來存盤預制件的設定,所以我可以生成它,并設定諸如PolygonCollider2D 的點之類的東西。這是一種創建許多相似物件的方法,而不必將每個物件都創建為預制件或預制件變體。
這些點似乎在一個名為 Paths 的陣列中,然后在其中的每個元素中,都有一個名為 Element 0 的陣列,其中包含 Vector2。我的對撞機始終只有一個路徑,所以我想復制該串列并將其粘貼到具有 Vector2 陣列的 Scriptable Object Asset 中:
public Vector2[] points;
我可以通過右鍵單擊點輕松地在 PolygonCollider2D 之間復制,然后選擇復制然后粘貼到另一個對撞機中。如果我將其粘貼到文本編輯器中,則會得到以下資訊:
GenericPropertyJSON:{"name":"m_Points","type":-1,"children":[{"name":"m_Paths","type":-1,"arraySize":1,"arrayType":"vector","children":[{"name":"Array","type":-1,"arraySize":1,"arrayType":"vector","children":[{"name":"size","type":12,"val":1},{"name":"data","type":-1,"arraySize":8,"arrayType":"Vector2","children":[{"name":"Array","type":-1,"arraySize":8,"arrayType":"Vector2","children":[{"name":"size","type":12,"val":8},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":0.067855835},{"name":"y","type":2,"val":-1.4540863}]},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":1.38775635},{"name":"y","type":2,"val":-0.6495056}]},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":1.77092743},{"name":"y","type":2,"val":1.06118774}]},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":1.6979599},{"name":"y","type":2,"val":1.639801}]},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":0.271110535},{"name":"y","type":2,"val":1.63804626}]},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":-1.778122},{"name":"y","type":2,"val":0.559341431}]},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":-1.65858459},{"name":"y","type":2,"val":-1.3278656}]},{"name":"data","type":8,"children":[{"name":"x","type":2,"val":-0.930610657},{"name":"y","type":2,"val":-1.62702942}]}]}]}]}]}]}
但是我不知道如何在 SO 中創建一個可以粘貼這些資料的欄位。
當我查看 PolygonCollider2D 的源代碼時,評論提到了角點,我不知道評論是否錯誤,但我也沒有看到GetPoints_Binding源代碼中的任何地方。
/// <summary>
/// <para>Corner points that define the collider's shape in local space.</para>
/// </summary>
/// <footer><a href="https://docs.unity3d.com/2020.3/Documentation/ScriptReference/30_search.html?q=PolygonCollider2D-points">`PolygonCollider2D.points` on docs.unity3d.com</a></footer>
public extern Vector2[] points { [NativeMethod("GetPoints_Binding"), MethodImpl(MethodImplOptions.InternalCall)] get; [NativeMethod("SetPoints_Binding"), MethodImpl(MethodImplOptions.InternalCall)] set; }
任何想法如何解決如何復制/粘貼這些?
![如何將點從 PolygonCollider2D 復制到 Vector2[]?](https://img.uj5u.com/2021/12/19/8238749c8ef54ddf8b0fc6967f18bc85.png)
![如何將點從 PolygonCollider2D 復制到 Vector2[]?](https://img.uj5u.com/2021/12/19/e955dcf504254925b7232e67d80b7277.png)
uj5u.com熱心網友回復:
您在那里獲得的 JSON 是 Unity 提供的一個特殊實用程式,用于通過 Unity 編輯器中的檢查器復制值。它特定于該組件型別,是您無法通過 API 直接訪問而只能通過檢查器訪問的私有序列化欄位的表示。
最簡單的狐貍將有一個同名的欄位,如
public float[] m_points;
但是,由于您無論如何都要按照代碼進行操作,因此根本不需要做您所做的事情。
Vector2是一個結構體,所以是一個值型別,根本不需要復制它們。
此外(作為 Unity 中的大多數公共成員)這PolygonCollider2D.points是一個在內部處理和復制 getter 和 setter 內的點的屬性,因此以后對陣列的更改不會影響它=> 也根本不需要復制陣列,無論如何它已經只回傳一個副本。
所以使用
points = colliderToCopyFrom.points;
已經是你需要做的一切。
并分配相同的
colliderToCopyFrom.points = someVector2Array;
但請記住,這些點位于對撞機的區域空間中。如果您在世界空間中需要它們,您可以將它們轉換為例如
using System.Linq;
...
worldPoints = colliderToCopyFrom.points.Select(p => colliderToCopyFrom.TransformPoint(p)).ToArray();
反過來
colliderToCopyFrom.points = worldPoints.Select(p => colliderToCopyFrom.InverseTransformPoint (p)).ToArray();
uj5u.com熱心網友回復:
我通過將它添加到 ScriptableObject 解決了這個問題,所以我可以通過分配碰撞器來復制點。它使用 Odin 作為按鈕。
希望它可以幫助有同樣不尋常問題的人:)
[ShowInInspector]
private PolygonCollider2D colliderToCopyFrom;
[Button]
private void CopyPoints() {
points = new Vector2[colliderToCopyFrom.points.Length];
Array.Copy(colliderToCopyFrom.points, points, colliderToCopyFrom.points.Length);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/385953.html
上一篇:Unity中協程的例外處理
