registriert haben sollte, und jeder IpUzzleItem muss auch einen Hinweis auf das Puzzle -Klasse haben. PrettyPrint-Override ">
Code: Select all
public class Puzzle : MonoBehaviour
{
private IEnumerable _puzzleItems;
[Inject]
private void Construct(IEnumerable puzzleItems)
{
_puzzleItems = puzzleItems; // should get all children with IPuzzleItem component
Debug.Log("items: " + string.Join(", ", _puzzleItems.Select(item => item.Name)));
}
}
public interface IPuzzleItem
{
PuzzleItemId Id { get; }
string Name { get; }
Puzzle Puzzle { get; }
}
public abstract class PuzzleItemBase : MonoBehaviour, IPuzzleItem
{
[SerializeField] private PuzzleItemId id;
[Inject]
private void Construct(Puzzle puzzle)
{
Puzzle = puzzle; // all children should have reference to Puzzle ancestor
Debug.Log(Puzzle.name);
}
public PuzzleItemId Id => id;
public string Name => gameObject.name;
public Puzzle Puzzle { get; private set; }
}
public class TogglablePuzzleItem : PuzzleItemBase
{
private void Start()
{
Debug.Log(Puzzle.name);
}
}
< /code>
Meine GameObjects in der Szene sind wie folgt strukturiert: < /p>
|- PuzzleManager
|--- Puzzle
|----- TogglablePuzzleItem (1)
|----- TogglablePuzzleItem (2)
|----- ...
|----- PuzzleLifetimeScope
|- PuzzleManager (2)
|--- Puzzle
|----- TogglablePuzzleItem (1)
|----- TogglablePuzzleItem (2)
|----- ...
|----- PuzzleLifetimeScope
Code: Select all
public class PuzzleLifetimeScope : LifetimeScope
{
[SerializeField] private Puzzle puzzle;
protected override void Configure(IContainerBuilder builder)
{
builder.RegisterInstance(puzzle);
var componentsInChildren = puzzle.GetComponentsInChildren();
foreach (var puzzleItem in componentsInChildren)
{
// the Puzzle class is still null
builder.RegisterInstance(puzzleItem);
}
// builder.RegisterComponentInHierarchy().As(); // injects only the first found item for the IEnumerable
}
}
Code: Select all
VContainerException: Conflict implementation type : Registration TogglablePuzzleItem ContractTypes=[Code.Scripts.PuzzleItems.IPuzzleItem] Singleton VContainer.Internal.ExistingInstanceProvider
VContainer.Internal.CollectionInstanceProvider.Add (VContainer.Registration registration) (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Internal/InstanceProviders/CollectionInstanceProvider.cs:61)
VContainer.Internal.Registry.AddToBuildBuffer (System.Collections.Generic.IDictionary`2[TKey,TValue] buf, System.Type service, VContainer.Registration registration) (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Registry.cs:70)
VContainer.Internal.Registry.Build (VContainer.Registration[] registrations) (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Registry.cs:28)
VContainer.ContainerBuilder.BuildRegistry () (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/ContainerBuilder.cs:166)
VContainer.ScopedContainerBuilder.BuildScope () (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/ContainerBuilder.cs:38)
VContainer.ScopedContainer.CreateScope (System.Action`1[T] installation) (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Container.cs:126)
VContainer.Container.CreateScope (System.Action`1[T] installation) (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Container.cs:263)
VContainer.Unity.LifetimeScope.Build () (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Unity/LifetimeScope.cs:199)
VContainer.Unity.LifetimeScope.Awake () (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Unity/LifetimeScope.cs:145)
VContainer.Unity.LifetimeScope.OnSceneLoaded (UnityEngine.SceneManagement.Scene scene, UnityEngine.SceneManagement.LoadSceneMode mode) (at ./Library/PackageCache/jp.hadashikick.vcontainer@94276e73bc7c/Runtime/Unity/LifetimeScope.AwakeScheduler.cs:88)
UnityEngine.SceneManagement.SceneManager.Internal_SceneLoaded (UnityEngine.SceneManagement.Scene scene, UnityEngine.SceneManagement.LoadSceneMode mode) (at :0)