@nyahiito (土肥 也汰)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Unityにて、エラーコード「Invalid Operation Exception」を解決したいです。

解決したいこと

僕はUnityにて、ClusterCreaterKitを使っているのですが、どうも導入がうまくいきません。
具体的にどこが問題かというと、ClusterCreaterKitを導入した後にプレイモードを押すと、数秒してからプレイモードが強制停止になるところです。
昨日はワールドのアップロードまで問題なくうまくいったのですが、、、

なので、どこをどう修正したらいいか、教えていただけると幸いです。

発生している問題・エラー

```invalidOperationException: Sequence contains no matching element
System.Linq.Enumerable.First[TSource] (System.Collections.Generic.IEnumerable`1[T] source, System.Func`2[T,TResult] predicate) (at <351e49e2a5bf4fd6beabb458ce2255f3>:0)
ClusterVR.CreatorKit.Editor.Preview.Bootstrap.GetComponentInGameObjectsChildren[T] (System.Collections.Generic.IEnumerable`1[T] rootGameObjects) (at /Users/tufeiyetai/Downloads/ClusterCreatorKit-1.11.1/Editor/Preview/Bootstrap.cs:129)
ClusterVR.CreatorKit.Editor.Preview.Bootstrap.OnChangePlayMode (UnityEditor.PlayModeStateChange playMode) (at /Users/tufeiyetai/Downloads/ClusterCreatorKit-1.11.1/Editor/Preview/Bootstrap.cs:85)
ClusterVR.CreatorKit.Editor.Preview.Bootstrap+<>c+<<-cctor>b__36_0>d.MoveNext () (at /Users/tufeiyetai/Downloads/ClusterCreatorKit-1.11.1/Editor/Preview/Bootstrap.cs:48)
--- End of stack trace from previous location where exception was thrown ---
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at <9577ac7a62ef43179789031239ba8798>:0)
System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) (at <9577ac7a62ef43179789031239ba8798>:0)
UnityEngine.UnitySynchronizationContext+WorkRequest.Invoke () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/UnitySynchronizationContext.cs:153)
UnityEngine.UnitySynchronizationContext:ExecuteTasks() (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/UnitySynchronizationContext.cs:107)


以下実際の写真です。
```

スクリーンショット 2021-02-09 23.01.00.png

該当するソースコード

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ClusterVR.CreatorKit.Editor.Fixer;
using ClusterVR.CreatorKit.Editor.Preview.EditorSettings;
using ClusterVR.CreatorKit.Editor.Preview.EditorUI;
using ClusterVR.CreatorKit.Editor.Preview.Gimmick;
using ClusterVR.CreatorKit.Editor.Preview.Item;
using ClusterVR.CreatorKit.Editor.Preview.Operation;
using ClusterVR.CreatorKit.Editor.Preview.RoomState;
using ClusterVR.CreatorKit.Editor.Preview.Trigger;
using ClusterVR.CreatorKit.Editor.Preview.World;
using ClusterVR.CreatorKit.Editor.ProjectSettings;
using ClusterVR.CreatorKit.Gimmick;
using ClusterVR.CreatorKit.Item;
using ClusterVR.CreatorKit.Operation;
using ClusterVR.CreatorKit.Preview.PlayerController;
using ClusterVR.CreatorKit.Trigger;
using ClusterVR.CreatorKit.World;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.XR;

namespace ClusterVR.CreatorKit.Editor.Preview
{
    [InitializeOnLoad]
    public static class Bootstrap
    {
        public static PlayerPresenter PlayerPresenter { get; private set; }
        public static SpawnPointManager SpawnPointManager { get; private set; }
        public static MainScreenPresenter MainScreenPresenter { get; private set; }
        public static CommentScreenPresenter CommentScreenPresenter { get; private set; }

        public static RoomStateRepository RoomStateRepository { get; private set; }
        public static GimmickManager GimmickManager { get; private set; }
        public static SignalGenerator SignalGenerator { get; private set; }
        public static bool IsInPlayMode { get; private set; }
        public static event OnInitializeEventHandler OnInitializedEvent;
        public delegate void OnInitializeEventHandler();

        static Bootstrap()
        {
#if !CLUSTER_CREATOR_KIT_DISABLE_PREVIEW
            EditorApplication.playModeStateChanged += async playMode =>
            {
                await OnChangePlayModeAsync(playMode);
                OnChangePlayMode(playMode);
            };
            SetupProject();
#endif
        }

        static void SetupProject()
        {
            ProjectSettingsConfigurer.Setup();
        }

        static void OnChangePlayMode(PlayModeStateChange playMode)
        {
            switch (playMode)
            {
                case PlayModeStateChange.ExitingPlayMode:
                    SetIsInGameMode(false);
                    break;
                case PlayModeStateChange.EnteredPlayMode:
                    SetIsInGameMode(true);

                    ItemIdAssigner.AssignItemId();
                    ItemTemplateIdAssigner.Execute();
                    LayerCollisionConfigurer.SetupLayerCollision();

                    var rootGameObjects = SceneManager.GetActiveScene().GetRootGameObjects();

                    var spawnPoints = GetComponentsInGameObjectsChildren<ISpawnPoint>(rootGameObjects);
                    SpawnPointManager = new SpawnPointManager(spawnPoints);


                    var enterDeviceType = EnterDeviceType.Desktop;
                    if (XRSettings.enabled)
                    {
                        enterDeviceType = EnterDeviceType.VR;
                    }

                    var despawnHeight = GetComponentInGameObjectsChildren<IDespawnHeight>(rootGameObjects).Height;
                    PlayerPresenter = new PlayerPresenter(PermissionType.Audience, enterDeviceType, SpawnPointManager);
                    new AvatarRespawner(despawnHeight, PlayerPresenter);

                    var itemCreator = new ItemCreator(GetComponentsInGameObjectsChildren<ICreateItemGimmick>(rootGameObjects));
                    var itemDestroyer = new ItemDestroyer(PlayerPresenter.PlayerTransform.GetComponent<IItemController>());
                    new ItemRespawner(despawnHeight, itemCreator, itemDestroyer, GetComponentsInGameObjectsChildren<IMovableItem>(rootGameObjects));

                    var mainScreenViews = GetComponentsInGameObjectsChildren<IMainScreenView>(rootGameObjects);
                    MainScreenPresenter = new MainScreenPresenter(mainScreenViews);

                    var rankingScreenViews = GetComponentsInGameObjectsChildren<IRankingScreenView>(rootGameObjects);
                    var rankingScreenPresenter = new RankingScreenPresenter(rankingScreenViews);
                    rankingScreenPresenter.SetRanking(11);

                    var commentScreenViews =
                        GetComponentsInGameObjectsChildren<ICommentScreenView>(rootGameObjects);
                    CommentScreenPresenter = new CommentScreenPresenter(commentScreenViews);

                    SetupTriggerGimmicks(rootGameObjects, itemCreator, itemDestroyer);

                    OnInitializedEvent?.Invoke();
                    break;
            }
        }

        static async Task OnChangePlayModeAsync(PlayModeStateChange playMode)
        {
            if (playMode != PlayModeStateChange.EnteredPlayMode)
            {
                return;
            }
            await PackageListRepository.UpdatePackageList();

            XRSettings.enabled = SwitchUseVR.EnabledVR();
        }

        static void SetIsInGameMode(bool value)
        {
            IsInPlayMode = value;
        }

        static T GetComponentInGameObjectsChildren<T>(IEnumerable<GameObject> rootGameObjects)
        {
            return rootGameObjects.Select(x =>
                    x.GetComponentInChildren<T>(true))
                .First(x => x != null);
        }

        static IEnumerable<T> GetComponentsInGameObjectsChildren<T>(IEnumerable<GameObject> rootGameObjects)
        {
            return rootGameObjects.SelectMany(x =>
                x.GetComponentsInChildren<T>(true));
        }

        static void SetupTriggerGimmicks(IEnumerable<GameObject> rootGameObjects, ItemCreator itemCreator, ItemDestroyer itemDestroyer)
        {
            RoomStateRepository = new RoomStateRepository();
            GimmickManager = new GimmickManager(RoomStateRepository, itemCreator, itemDestroyer);
            SignalGenerator = new SignalGenerator();
            var triggerManager = new TriggerManager(RoomStateRepository, itemCreator, GimmickManager, SignalGenerator);
            var items = GetComponentsInGameObjectsChildren<IItem>(rootGameObjects).ToArray();
            triggerManager.Add(items.SelectMany(x => x.gameObject.GetComponents<IItemTrigger>()));
            triggerManager.Add(GetComponentsInGameObjectsChildren<IPlayerTrigger>(rootGameObjects));
            triggerManager.Add(GetComponentsInGameObjectsChildren<IGlobalTrigger>(rootGameObjects));
            GimmickManager.AddGimmicksInScene(GetComponentsInGameObjectsChildren<IGimmick>(rootGameObjects));
            foreach (var item in items) GimmickManager.AddGimmicksInItem(item.gameObject.GetComponentsInChildren<IGimmick>(true), item.Id.Value);

            new LogicManager(itemCreator, RoomStateRepository, GimmickManager,
                GetComponentsInGameObjectsChildren<IItemLogic>(rootGameObjects),
                GetComponentsInGameObjectsChildren<IPlayerLogic>(rootGameObjects),
                GetComponentsInGameObjectsChildren<IGlobalLogic>(rootGameObjects),
                SignalGenerator);
            new PlayerEffectManager(PlayerPresenter, itemCreator, GetComponentsInGameObjectsChildren<IPlayerEffectGimmick>(rootGameObjects));
            new CreateItemGimmickManager(itemCreator, GetComponentsInGameObjectsChildren<ICreateItemGimmick>(rootGameObjects));
            new DestroyItemGimmickManager(itemCreator, itemDestroyer, GetComponentsInGameObjectsChildren<IDestroyItemGimmick>(rootGameObjects));

            var onReceiveOwnershipItemTriggerManager = new OnReceiveOwnershipItemTriggerManager(itemCreator);
            var onCreateItemTriggerManager = new OnCreateItemTriggerManager(itemCreator);
            var onJoinPlayerTriggerManager = new OnJoinPlayerTriggerManager();

            onCreateItemTriggerManager.Invoke(items.SelectMany(x => x.gameObject.GetComponents<IOnCreateItemTrigger>()));
            onJoinPlayerTriggerManager.Invoke(GetComponentsInGameObjectsChildren<IOnJoinPlayerTrigger>(rootGameObjects));
            onReceiveOwnershipItemTriggerManager.InvokeOnStart(items.SelectMany(x => x.gameObject.GetComponents<IOnReceiveOwnershipItemTrigger>()));
        }
    }
}

自分で試したこと

PCの再起動
公式のドキュメントを見ながらインストールを進めた
ひとつ古いバージョンのCreaterKitの導入
何度も新規プロジェクトを立ち上げた
エラーコードを見て「InvalidOperationException」を検索したのだが、スクリプトエラーらしいのは分かりましたが、自分には難しすぎました。

0 likes

1Answer

invalidOperationException: Sequence contains no matching element

これをそのまま Google 検索すれば出てきますが、 First() で条件に一致する要素がひとつも見つからないときに出るエラーです。エラーの場所もエラーメッセージに出ています。エラーメッセージ2行目の

System.Linq.Enumerable.First[TSource] (System.Collections.Generic.IEnumerable1[T] source, System.Func2[T,TResult] predicate) (at <351e49e2a5bf4fd6beabb458ce2255f3>:0)
ClusterVR.CreatorKit.Editor.Preview.Bootstrap.GetComponentInGameObjectsChildren[T] (System.Collections.Generic.IEnumerable`1[T] rootGameObjects) (at /Users/tufeiyetai/Downloads/ClusterCreatorKit-1.11.1/Editor/Preview/Bootstrap.cs:129)

at 略/Editor/Preview/Bootstrap.cs:129 の通り、ソースコードの129行目です。(実際に First() があるのは131行目ですが、129行目から始まる文の一部なのでこう表示されます。)

        static T GetComponentInGameObjectsChildren<T>(IEnumerable<GameObject> rootGameObjects)
        {
            return rootGameObjects.Select(x =>
                    x.GetComponentInChildren<T>(true))
                .First(x => x != null);
        }

ここを起点に原因を調査してみてください。

0Like

Comments

  1. @nyahiito

    Questioner

    返信が遅くなって、すみません。
    そこらへんを起点にやってみます。ありがとうございました!

Your answer might help someone💌