Notifications
bg
かんぴょう
0
Likes
1
Follower
0
Connections
All
Articles0
Games0
Showcases0
Column0
Jobs0
いつもお世話になっております。私ばっかり質問してる気がして少し気まずいのですが。頻繁ですがご教授お願いします。

2Dの質問です。

public void OnFightClick()
{
MainText.alignment = TextAnchor.UpperRight;

MainTextUI.localScale = new Vector3(21, 15, 0);

MainTextUI.position = new Vector3(238, -83, 0);
}

というコードをかき先日ご回答いただいた方法でボタンに反映させました。

しかし動画の通り(一瞬すぎて見にくいですね。申し訳ありません。)ボタンを押すと消えてしまいます。同じ座標にUnity側から変更すると正しく表示されます。なぜでしょうか?Z値などをいじってみたのですが良く分からず…
ご教授お願い致します。

自己解決しました。ありがとうございました。
こんにちは。いつもお世話になっております。

ボタン'(Button)に関してを聞きしたいことがございます。
通常関数指定の場所にはpublic関数なら表示されるはずだと思います。
しかし表示されずネットで調べても「publicにしてね!」という注意が書かれているだけでした。
そもそもネットで見た画像より選択肢が少ないように思います。(MonoScriptの他に選択肢があったように思いました。)
なにかが足りていないのではないかと思います。
ご教授お願い致します。

ソースコード:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyButton : MonoBehaviour {
public void OnMyButton()
{
Debug.Log("test");
}
}

かんぴょう
4 days ago
tamtamあ、ごめんなさい。勘違いしていました。スクリーンショットを見たらスクリプトの方を指定してますが、正しくは「MyButton.csをアタッチしているゲームオブジェクト」を指定する・・・でした。「using UnityEngine.UI;」は関係ない話でした・・・。
ありがとうございます。おかげさまで実装することが出来ました。
tamtam
4 days ago
あ、ごめんなさい。勘違いしていました。スクリーンショットを見たらスクリプトの方を指定してますが、正しくは「MyButton.csをアタッチしているゲームオブジェクト」を指定する・・・でした。「using UnityEngine.UI;」は関係ない話でした・・・。
かんぴょう
4 days ago
tamtam「using UnityEngine.UI;」を追加すると動くはずです。
お忙しいところ返信ありがとうございます。 追加してみましたが表示されませんでした。 もちろん「MyButton.cs」ファイルはアタッチしています。
tamtam
5 days ago
「using UnityEngine.UI;」を追加すると動くはずです。
2Dに関しての質問です。
プレイヤーがオブジェクトに近づいて右クリックするとイベントが発生する(今はログを出力しようとしています)システムを作成しようと以下のコードをかきました。

void OnTriggerStay(Collider other)
{
if (other.gameObject.CompareTag("WeponShop") && Input.GetKeyDown(KeyCode.Mouse1))
{
Debug.Log("test");
}
}

しかしこれでは動きませんでした。
オブジェクトにTagが設定されているかは確認しました。

私の推測ですが OnTriggerStay 関数がInputを受け付けないのではないかと思います。(Inputをコメント化して動かすと正常な動作をするため)
なにか代用策はございますでしょうか。
初投稿なので情報不足かもしれませんがご指導いただければと思います。

かんぴょう
7 days ago
fantomそうですね。フラグに関してはそんな感じで良いと思います。 あまり良いコードとは言えませんが、例えば、 bool onWeponShop = false; private void Update () { if (Input.GetKeyDown(KeyCode.Mouse1)) { if (onWeponShop) { Debug.Log("Right click and onWeponShop."); } } } void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag("WeponShop")) { onWeponShop = true; } } void OnTriggerStay2D(Collider2D other) { if (other.gameObject.CompareTag("WeponShop")) { onWeponShop = true; } } void OnTriggerExit2D(Collider2D other) { if (other.gameObject.CompareTag("WeponShop")) { onWeponShop = false; } } みたいに書いても良いですね(接触ではフラグ操作だけ、処理開始は右クリックのタイミング)。 私が実験してみたところ、投稿された元のコードでもタイミング良く、プレイヤーをオブジェクトに接触させた瞬間(動かして接触)に右クリックしたら "test" という文字が出ましたね(笑)。 しかしそれだとやはり、右クリックのような常に監視しているイベントと、接触のような不定に起こるイベントでは時間的な「ずれ」が生じるので、設計上良くないですね。 同じ時間上で判定するには、右クリックした瞬間に、接触関数でタグを調べるようにすれば良いわけです。例えば、 void Update () { if (Input.GetKeyDown(KeyCode.Mouse1)) { if (IntersectObjectWithTag("WeponShop")) { Debug.Log("Right click and onWeponShop."); } } } //一定領域内(Box)で指定タグを持ったコライダと接触してるか? bool IntersectObjectWithTag(string tag) { Vector2 pos = transform.position; var colls = Physics2D.OverlapBoxAll(pos, Vector2.one, 0); //Vector2.one は判定領域の大きさ int idx = Array.FindIndex(colls, delegate(Collider2D c){return c.CompareTag(tag);}); return idx >= 0; } のような感じですかね。ここでは OverlapBoxAll で箱型にしてますが、OverlapCircleAll のような円形にした方が負荷は軽くなりますね。また OverlapBoxAll などはレイヤー(layerMask)や深度(minDepth, maxDepth)も指定できるので、できる限り判定条件を絞り込んだ方がより軽くなります(ここでは Array.FindIndex(線形探索)を使ってるので、大量のオブジェクトがあるなら、予め絞り込んだ方が良い)。 接触関数を使う場合は「OnTrigger~」イベントやフラグ(onWeponShop)が無くなるのですっきりしたと思います。ただ複数のタグを判定するなら、IntersectObjectWithTag() を複数判定用に改良した方が良いですね(この例では単一タグ用なので、2つ以上判定する場合は効率が悪い)。 今回は EventTrigger 系のインターフェイスの例は割愛しますが、色々な方法を試してみると勉強になりますね。 特にUnityは「フレーム毎更新するアプリケーション」なので「イベント駆動型プログラミング」的に考えると失敗することが多いです(←実はここが今回の一番の「肝」なのです)。常に「どのタイミングで処理するか?」ということを考えながらコーディングすると、正しい方向性がわかるようになって来ますよ!
とても分かりやすいご説明ありがとうございます。 これからの開発に参考にさせて頂きます。 また機会がありましたら宜しくお願い致します。
fantom
8 days ago
そうですね。フラグに関してはそんな感じで良いと思います。 あまり良いコードとは言えませんが、例えば、 bool onWeponShop = false; private void Update () { if (Input.GetKeyDown(KeyCode.Mouse1)) { if (onWeponShop) { Debug.Log("Right click and onWeponShop."); } } } void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag("WeponShop")) { onWeponShop = true; } } void OnTriggerStay2D(Collider2D other) { if (other.gameObject.CompareTag("WeponShop")) { onWeponShop = true; } } void OnTriggerExit2D(Collider2D other) { if (other.gameObject.CompareTag("WeponShop")) { onWeponShop = false; } } みたいに書いても良いですね(接触ではフラグ操作だけ、処理開始は右クリックのタイミング)。 私が実験してみたところ、投稿された元のコードでもタイミング良く、プレイヤーをオブジェクトに接触させた瞬間(動かして接触)に右クリックしたら "test" という文字が出ましたね(笑)。 しかしそれだとやはり、右クリックのような常に監視しているイベントと、接触のような不定に起こるイベントでは時間的な「ずれ」が生じるので、設計上良くないですね。 同じ時間上で判定するには、右クリックした瞬間に、接触関数でタグを調べるようにすれば良いわけです。例えば、 void Update () { if (Input.GetKeyDown(KeyCode.Mouse1)) { if (IntersectObjectWithTag("WeponShop")) { Debug.Log("Right click and onWeponShop."); } } } //一定領域内(Box)で指定タグを持ったコライダと接触してるか? bool IntersectObjectWithTag(string tag) { Vector2 pos = transform.position; var colls = Physics2D.OverlapBoxAll(pos, Vector2.one, 0); //Vector2.one は判定領域の大きさ int idx = Array.FindIndex(colls, delegate(Collider2D c){return c.CompareTag(tag);}); return idx >= 0; } のような感じですかね。ここでは OverlapBoxAll で箱型にしてますが、OverlapCircleAll のような円形にした方が負荷は軽くなりますね。また OverlapBoxAll などはレイヤー(layerMask)や深度(minDepth, maxDepth)も指定できるので、できる限り判定条件を絞り込んだ方がより軽くなります(ここでは Array.FindIndex(線形探索)を使ってるので、大量のオブジェクトがあるなら、予め絞り込んだ方が良い)。 接触関数を使う場合は「OnTrigger~」イベントやフラグ(onWeponShop)が無くなるのですっきりしたと思います。ただ複数のタグを判定するなら、IntersectObjectWithTag() を複数判定用に改良した方が良いですね(この例では単一タグ用なので、2つ以上判定する場合は効率が悪い)。 今回は EventTrigger 系のインターフェイスの例は割愛しますが、色々な方法を試してみると勉強になりますね。 特にUnityは「フレーム毎更新するアプリケーション」なので「イベント駆動型プログラミング」的に考えると失敗することが多いです(←実はここが今回の一番の「肝」なのです)。常に「どのタイミングで処理するか?」ということを考えながらコーディングすると、正しい方向性がわかるようになって来ますよ!
かんぴょう
8 days ago
Yuji YASUHARAふと「2Dって何か特殊なことあるのかな」と思ってググってみたら、こんな記事がありました。 http://pafu-of-duck.hatenablog.com/entry/2017/11/29/073337 これが事実かどうか確認していないのですが、参考になるでしょうか。
忙しいところご尽力いただきありがとうございます。 参考にさせて頂きます。 先日は間違ったグループに投稿してしまい申し訳ありませんでした。
かんぴょう
8 days ago
fantomまぁ、仮にできたとしても、Input みたいなリアルタイムに入力を取得する関数は Update() みたいなフレーム更新メソッドでやるのが普通だと思います(笑)。イベント駆動だと、そのイベントが発生した瞬間に、同時に入力を判定しないと行けませんしね(リアルタイムイベント取得メソッドとイベント駆動メソッドの同時使用は、時間軸上が同じではないため、プログラミング設計パターンとして間違ってます)。 簡単なパターンとしては、イベント(On~など)ではフラグを上げておいて、フレーム毎更新(フレーム毎コルーチンでも可)で、そのフラグを取得して処理を開始する、という方法がありますね。もちろんこの場合、処理中にフラグを適切に管理しないと、毎フレーム処理されてしまうので注意が必要です(処理が終わったらフラグを元に戻す必要もあります)。 ただこの例のようなものなら EventTrigger 系のインターフェイス(IPointerDownHandler など)をオブジェクトに使うのも良いかもですね(そのオブジェクト上でのみ、イベント発生を取得する方法)。その場合、接触判定のフラグを保持しておいて、その上でイベント発生で処理分岐した方が確実です。 またはイベントが発生したときに Physics.OverlapSphere() のような接触関数で判定するのもありです。この場合は2つの判定を同じ時間上で行っているのでフラグは必要ありません(コードとしては1つのメソッドにまとめることもできるので、すっきりとするメリットもあります)。 色々方法はあると思いますが、この辺は慣れ(パターン)なので、自分のやりやすい方法を模索してみるのも良いかもですね(笑)。
ご指導ありがとうございます。 フラグというものをあまり理解していないのですが 接触するとフラグを立てその間だけ入力が可能になり離れると折る。 ということでしょうか。 間違っていたら再度ご指導のほど宜しくお願い致します。
About Me
No description
See more
Skills
No skills added yet
Certifications (0)
Import
See all
かんぴょう's liked projects (0)
No likes yet
Following (1)
Follower (1)
Following Companies (0)
Not following anyone yet