質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2326閲覧

パターンロックで、決められたパターン入力時にイベントを発生させたい。

yonsan

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/06/24 20:11

前提・実現したいこと

unity2Dでパターンロックを利用したゲームを制作中です。
パターンロックのイメージとしては、9つの丸い2Dオブジェクトがあり、それらを線で結ぶイメージです。
イメージ説明
イメージ説明
丸い2Dオブジェトには、idが割り振られています。
idの並び順でパターンを取得することが狙いです。
該当ソースコードにより、パターンロックは実装できましたが、そこからイベントとの紐づけができません。
実現したいことは以下の例です。

(例)
パターン1の場合、イベントAが発生。
パターン2の場合、イベントBが発生。

該当のソースコードにコードを加える形でご教授いただきたいです。
また、足りない情報等ありましたら、ご教授願います。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

unityC#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class LockPattern : MonoBehaviour 6{ 7 public GameObject linePrefab; 8 public Canvas canvas; 9 10 private Dictionary<int, CircleIdentifier> circles; 11 12 private List<CircleIdentifier> lines; 13 14 private GameObject lineOnEdit; 15 private RectTransform lineOnEditRcTs; 16 private CircleIdentifier circleOnEdit; 17 18 private bool unlocking; 19 20 new bool enabled = true; 21 22 // Start is called before the first frame update 23 void Start() 24 { 25 circles = new Dictionary<int, CircleIdentifier>(); 26 lines = new List<CircleIdentifier>(); 27 28 for (int i = 0;i < transform.childCount;i++) 29 { 30 var circle = transform.GetChild(i); 31 32 var identifier = circle.GetComponent<CircleIdentifier>(); 33 34 identifier.id = i; 35 36 circles.Add(i, identifier); 37 38 // circles.Add(circle.gameObject); 39 40 } 41 } 42 43 // Update is called once per frame 44 void Update() 45 { 46 if(enabled == false) 47 { 48 return; 49 } 50 51 if (unlocking) 52 { 53 Vector3 mousePos = canvas.transform.InverseTransformPoint(Input.mousePosition); 54 55 lineOnEditRcTs.sizeDelta = new Vector2(lineOnEditRcTs.sizeDelta.x, Vector3.Distance(mousePos, circleOnEdit.transform.localPosition)); 56 57 lineOnEditRcTs.rotation = Quaternion.FromToRotation( 58 Vector3.up, 59 (mousePos - circleOnEdit.transform.localPosition).normalized); 60 } 61 } 62 63 IEnumerator Release() 64 { 65 enabled = false; 66 67 yield return new WaitForSeconds(3); 68 69 foreach(var circle in circles) 70 { 71 circle.Value.GetComponent<UnityEngine.UI.Image>().color = Color.white; 72 circle.Value.GetComponent<Animator>().enabled = false; 73 } 74 75 foreach(var line in lines) 76 { 77 Destroy(line.gameObject); 78 } 79 80 lines.Clear(); 81 82 lineOnEdit = null; 83 lineOnEditRcTs = null; 84 circleOnEdit = null; 85 86 enabled = true; 87 } 88 89 GameObject CreateLine(Vector3 pos, int id) 90 { 91 var line = GameObject.Instantiate(linePrefab, canvas.transform); 92 93 line.transform.localPosition = pos; 94 95 var lineIdf = line.AddComponent<CircleIdentifier>(); 96 97 lineIdf.id = id; 98 99 lines.Add(lineIdf); 100 101 return line; 102 } 103 104 105 void TrySetLineEdit(CircleIdentifier circle) 106 { 107 foreach (var line in lines) 108 { 109 if(line.id == circle.id) 110 { 111 return; 112 } 113 } 114 115 lineOnEdit = CreateLine(circle.transform.localPosition, circle.id); 116 lineOnEditRcTs = lineOnEdit.GetComponent<RectTransform>(); 117 circleOnEdit = circle; 118 } 119 120 void EnableColorFade(Animator anim) 121 { 122 anim.enabled = true; 123 anim.Rebind(); 124 } 125 126 public void OnMouseEnterCircle(CircleIdentifier idf) 127 { 128 129 if (enabled == false) 130 { 131 return; 132 } 133 134 //Debug.Log(idf.id); 135 136 if (unlocking) 137 { 138 lineOnEditRcTs.sizeDelta = new Vector2(lineOnEditRcTs.sizeDelta.x, Vector3.Distance(circleOnEdit.transform.localPosition, idf.transform.localPosition)); 139 lineOnEditRcTs.rotation = Quaternion.FromToRotation( 140 Vector3.up, 141 (idf.transform.localPosition - circleOnEdit.transform.localPosition).normalized); 142 143 TrySetLineEdit(idf); 144 } 145 } 146 147 public void OnMouseExitCircle(CircleIdentifier idf) 148 { 149 if (enabled == false) 150 { 151 return; 152 } 153 154 //Debug.Log(idf.id); 155 } 156 157 public void OnMouseDownCircle(CircleIdentifier idf) 158 { 159 if (enabled == false) 160 { 161 return; 162 } 163 164 //Debug.Log(idf.id); 165 166 unlocking = true; 167 168 TrySetLineEdit(idf); 169 } 170 171 public void OnMouseUpCircle(CircleIdentifier idf) 172 { 173 if (enabled == false) 174 { 175 return; 176 } 177 178 //Debug.Log(idf.id); 179 180 if (unlocking) 181 { 182 foreach(var line in lines) 183 { 184 EnableColorFade(circles[line.id].gameObject.GetComponent<Animator>()); 185 } 186 187 Destroy(lines[lines.Count - 1].gameObject); 188 lines.RemoveAt(lines.Count - 1); 189 190 foreach(var line in lines) 191 { 192 EnableColorFade(line.GetComponent<Animator>()); 193 } 194 195 StartCoroutine(Release()); 196 } 197 198 unlocking = false; 199 200 } 201} 202

試したこと

・最初に決められたパスワードを格納
public string curPassword = "12345";

・public void OnMouseEnterCircle(CircleIdentifier idf){}内に以下コードを入れ、idを取得する。

if (idf.id == 0) { Debug.Log("0取得"); input = input + "0"; } if (idf.id == 1) { Debug.Log("1取得"); input = input + "1"; }




id 0~8まで用意。

・void Update(){}内に以下コードを入れ、input情報がcurPasswordと同じなら、
デバッグログが発生。
if (input == curPassword)
{
Debug.Log(”EventA");
}

しかし、id=12345となるようにパターンを完成させても、Debug.Log(”EventA");は発生しなかった。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2020/06/25 00:32

「Debug.Log("0取得");」等の取得時のログは表示されていますか? また、OnMouseEnterCircleに「Debug.Log(input);」を入れて値を確認してみてください。
yonsan

2020/06/25 00:47

「Debug.Log("0取得");」等のログは、0~8まで表示されます。 しかし、マウスが丸いオブジェクト内で動くたびに取得してしまい、大量に取得してしまいます。 OnMouseEnterなので、マウスが対象オブジェクトに侵入した時のみに取得するようにしたつもりなのですが・・・。 Debug.Log(input);の値は、id1とid2のオブジェクトを結んだところ、「1111111111111111111111122」となりました。
guest

回答1

0

ベストアンサー

同一箇所で連続して通過シグナルが発生しているようなので、それを抑制します。

if (idf.id == 0) {   Debug.Log("0取得"); if (input.EndsWith("0") == false) {   input = input + "0"; } }

投稿2020/06/25 01:26

YT0014

総合スコア1750

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yonsan

2020/06/25 01:44

回答の通り直しましたところ、Debug.Log(”EventA");は出力されました。 EndsWithで同じidが連続でinputされないようになり、狙いが実現しました。 ありがとうございました。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問