Wie mache ich eine einfache Injektion mehrerer Elemente, die mit VContainer in GameObject gesenkt werden?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie mache ich eine einfache Injektion mehrerer Elemente, die mit VContainer in GameObject gesenkt werden?

Post by Anonymous »

Ich bin ziemlich neu in VContainer < /code> und ich kämpfe mit der Injektion von GameObjects. Jedes dieser Objekte hat eine Rätsel Klasse, die alle IPUzzleInTeM als iEnumerable
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
Ich habe versucht, ein puzzlelifetimescope zu erstellen, um meine Initialisierungen pro Objekt zu verfolgen und es einfacher zu machen, aber das funktioniert nicht:

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
}
}
Es gibt auch einen Fehler bei meiner aktuellen Implementierung von puzzlelifetimescope :

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)
Ich konnte nicht aus den Dokumenten herausfinden, was die richtige Art ist, um das zu erreichen, was ich mit VContainer erreichen möchte. Das Ändern von PuzzlelifetimesCope ist wahrscheinlich der richtige Weg, aber ich stecke dort fest.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post