質問: 0; i < listAudioClips.Count(); ++i) tagToIndex.Add(listAudioClips[i].groundTypeTag, i); } } ``` ### 追記2 どうやら足が地面に接触し、地面の`tag`を取得する前に足の親要素であるオブジェクトのコライダに判定をとられてしまい、その親のオブジェクトの`tag`を`tagToIndex`の`Key`と照らし合わせてしまっているようです。 ### 追記3 レイヤーと*LeyerCollisionMatrix*を用いてプレイヤーと足のコライダとの間で判定が 起こらないようにしました。 しかし、そもそも足のコライダが地面のコライダと接触していないようです。(`OnTriggerEnter()`が呼び出されていない)
回答: 本題に提示されているコードに不審な点は見つかりません。 単純に tagToIndex に other.gameObject.tag のキーが存在しないことを疑うべきでしょう。 Awake() で存在確認できていても、RelayedTrigger() 実行時にそのキーが存在するとは限りません。実行前に他のコードによって変更される可能性が否定できないためです。 なので、検証コードは RelayedTrigger() に実装して確認するのがよいと思います。 例えば、以下のようにします。 ``` using System; using System.Linq; public void RelayedTrigger(Collider other) { if (tagToIndex.ContainsKey(other.gameObject.tag)) { groundIndex = tagToIndex[other.gameObject.tag]; } else { // 検証用コード:見つからないときに詳細にチェックする string tag = other.gameObject.tag; bool exists = false; Debug.Log("Check..."); foreach (var key in tagToIndex.Keys) { Debug.Log($"Key: {GetStringWithHex(key)}"); if (key == tag) { Debug.Log("** Find !! **"); exists = true; } } Debug.Log("Check done."); Debug.Log($"{GetStringWithHex(tag)} は" + (exists ? "見つかりました" : "見つかりませんでした")); Debug.Break(); // 実行を中断 } } // 文字列に16新数表示を追加 private string GetStringWithHex(string input) { return $"{input}({string.Join("-", input.ToCharArray().Select(e => Convert.ToInt32(e).ToString("X2")))})"; } ```