Ваш CreateObject
метод - static
, но ваше canClickSceneViewToCreatePath
- нет.
Это не имеет ничего общего со сценарием редактора, а с самим вашим классом SlMenuItems
.
Метод static
не является экземпляром или другими словами, он является своего рода общим для всех экземпляров этого типа компонента, в то время как нестатическое значение может отличаться для каждого компонента.
Так как же статическому методу - который одинаков для всех экземпляров - "знать", к каким значениям экземпляров он должен обращаться?
Так что либо сделайте метод нестатичным, либо переменную статической. В зависимости от ваших дальнейших потребностей.
Поскольку MenuItem
нужен статический метод, переменная также должна быть статической.
Я бы посоветовал вам вообще не наследовать этот класс от MonoBehaviour
, поскольку он не имеет поведения для GameObject. Он содержит только некоторые функции редактора, поэтому лучше сделать его статическим классом, который может «жить» в ресурсах без необходимости его создания.
Чем вы можете использовать SceneView.onSceneGUIDelegate
для регистрации обратного вызова для OnSceneGUI
без реализации сценария редактирования для этого:
private static GameObject lastCreated;
private static bool isCreating;
public static class SLMenuItems
{
[MenuItem("Component/Create Custom Object")]
private static void CreateObject()
{
Debug.Log("menu item selected");
isCreating = true;
lastCreated = null;
// Add a callback for SceneView update
SceneView.onSceneGUIDelegate -= UpdateSceneView;
SceneView.onSceneGUIDelegate += UpdateSceneView;
}
private static void UpdateSceneView(SceneView sceneView)
{
if(lastCreated)
{
// Keep lastCreated focused
Selection.activeGameObject = lastCreated;
}
if(isCreating)
{
if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
{
Vector3 pointsPos = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin;
//Todo create object here at pointsPos
lastCreated = Instantiate(somePrefab);
// Avoid the current event being propagated
// I'm not sure which of both works better here
Event.current.Use();
Event.current = null;
// Keep the created object in focus
Selection.activeGameObject = lastCreated;
// exit creation mode
isCreating = false;
}
}
else
{
// Skip if event is Layout or Repaint
if(e.type == EventType.Layout || e.type == EventType.Repaint)
{
Selection.activeGameObject = lastCreated;
return;
}
// Prevent Propagation
Event.current.Use();
Event.current = null;
Selection.activeGameObject = lastCreated;
lastCreated = null;
// Remove the callback
SceneView.onSceneGUIDelegate -= UpdateSceneView;
}
}
}
Но я предлагаю вам изменить название вопроса, так как это на самом деле не решение «задачи», которую вы описали ранее.