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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

641閲覧

登録されたマルチなデリゲートを選択して呼び出したい

Nathalie_22

総合スコア10

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2023/03/15 01:11

実現したいこと

Unityである範囲までCubeを生成するという機能があって、生成範囲をユーザーがUIから選択することが出来ます。選択してもらったサイズでCubeを生成するのですが生成する関数をマルチキャストデリゲートで登録しています。登録されたデリゲートをどれか一つ選択して呼び出すにはどのように書けばよいですか?

前提

Cubeの生成処理自体は既に出来上がっており問題ないです。
マルチキャストデリゲートで登録した関数を選択して呼び出す方法が調べても出てこなかったです。

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeSpawner : MonoBehaviour
{
//スポーンサイズは1010, 2020, 30*30
//デリゲート
public delegate void DelegateFunc();

public DelegateFunc delegateFunc;

[SerializeField]
private GameObject ACube;
[SerializeField]
private GameObject BCube;

void Start()
{
//デリゲートの登録
delegateFunc += GenerateCubeSizeTen;
delegateFunc += GenerateCubeSizeTwenty;
delegateFunc += GenerateCubeSizeThirty;
delegateFunc(); //登録されたデリゲートを呼び出し
}

//10*10の場合
public void GenerateCubeSizeTen()
{

for (int x = 0; x <= 10; x++) { for (int z = 1; z <= 10; z++) { for (int y = 0; y >= -1; y--) { Instantiate(ACube, new Vector3(x, y, z), Quaternion.identity); } } } for (int x = 0; x <= 10; x++) { for (int z = 1; z <= 10; z++) { for (int y = -2; y >= -10; y--) { Instantiate(BCube, new Vector3(x, y, z), Quaternion.identity); } } }

}

//20*20の場合
public void GenerateCubeSizeTwenty()
{
for (int x = 0; x <= 20; x++)
{
for (int z = 1; z <= 20; z++)
{
for (int y = 0; y >= -1; y--)
{
Instantiate(ACube, new Vector3(x, y, z), Quaternion.identity);
}

} } for (int x = 0; x <= 20; x++) { for (int z = 1; z <= 20; z++) { for (int y = -2; y >= -10; y--) { Instantiate(BCube, new Vector3(x, y, z), Quaternion.identity); } } }

}
//30*30の場合
public void GenerateCubeSizeThirty()
{
for (int x = 0; x <= 30; x++)
{
for (int z = 1; z <= 30; z++)
{
for (int y = 0; y >= -1; y--)
{
Instantiate(ACube, new Vector3(x, y, z), Quaternion.identity);
}

} } for (int x = 0; x <= 30; x++) { for (int z = 1; z <= 30; z++) { for (int y = -2; y >= -10; y--) { Instantiate(BCube, new Vector3(x, y, z), Quaternion.identity); } } }

}
}

試したこと

デリゲートにint型の引数を持たせて数値によって関数選択と考えましたがうまく書けなかったです。

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

Unity2020.3.25

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

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

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

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

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

Zuishin

2023/03/15 01:18

選択するためにはその関数を特定する必要がありますが、特定できるなら直接呼び出す方が早いでしょう。
episteme

2023/03/15 03:00

> デリゲートにint型の引数を持たせて数値によって関数選択と考えましたがうまく書けなかったです。 この理由が知りたい。public delegate void DelegateFunc(int); とするだけなんだけど、こdelegeteに着火(call)する際引数を渡すことができなかった、ってこと?
Zuishin

2023/03/15 03:31

episteme さん、最近なぜか Unity 界隈で流行っているマルチキャストデリゲートです。 一つのデリゲートに複数のメソッドを登録したところ、その中の一部のみ呼び出すことができず困っているようです。 FormClosing イベントのように引数を使って handled 制御する方法もありますが、それはイベントだからそうせざるを得ないという面もあり、素直にリストやディクショナリで解決するんじゃないかと思っています。
fana

2023/03/15 04:29

この例の3つの「関数」の中身だと,(ぱっと見ですが)ループ回数が違うだけにしか見えない. そしたらそもそも 3つの関数 に書き分けていることが……みたいなのは主題とは関係ないから言うべきではないのか…な?
guest

回答1

0

自己解決

デリゲートに引数を持たせて関数を選択して実装できました。変に難しく考えてました^^;

投稿2023/03/15 03:47

Nathalie_22

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問