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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

3回答

1358閲覧

変数の宣言も含めた処理も含めてメソッドにしたい

spawn

総合スコア14

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2017/11/06 06:27

Unity3D上で2D画像を表示する、という部分は大量に使うので
メソッドとしてまとめて再利用したいのですが、

using UnityEngine.UI;

public static GameObject hoge_image;

hoge_image.transform.parent = GameObject.Find("Panel").transform;
hoge_image.AddComponent<RectTransform>().anchoredPosition = new Vector3(0, 0, 0);
hoge_image.GetComponent<RectTransform>().localScale = new Vector3(1, 1, 1);
hoge_image.AddComponent<Image>().sprite = Resources.Load<Sprite>("image");
hoge_image.GetComponent<Image>().preserveAspect = true;

こういった部分をいざ
2DInit(hoge_image,Panel,image);
のようなメソッドにしようとするとどうすればいいのかさっぱり分かりません。

恐らく多くの人が書く部分だと思うのですが、普通はどうするのでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

変数宣言をメソッドの中に含めて、メソッドの外でそれを使うことはC#ではできません。例えば、

C#

1public static void Declare() 2{ 3 int x = 12; 4 // 変数 x の寿命がここで終わる 5} 6 7public static void Main(string[] args) 8{ 9 Declare(); 10 Console.WriteLine(x); // ここでエラー! xは宣言されていない扱いになる 11}

以上のコードはコンパイルが通りません。メソッドの中で宣言した変数をメソッドの外で使う手段はありません。

spawnさんが挙げている例であれば、メソッドに戻り値を持たせ、メソッドを呼び出した際の戻り値を変数に受ける方法が一般的であると思います。メソッドの中で変数を宣言してインスタンスを代入したのち、return文でメソッドを呼び出した側に返します。以下のようなメソッドを作ることになるでしょう。

C#

1class SampleBehavior : MonoBehavior 2{ 3 public static GameObject Init2D(string objectName, string imageName) 4 { 5 // 変数を宣言してインスタンスを代入する 6 GameObject hoge_image = new GameObject(); 7 8 // セットアップ 9 hoge_image.transform.parent = GameObject.Find(objectName).transform; 10 hoge_image.AddComponent<RectTransform>().anchoredPosition = new Vector3(0, 0, 0); 11 hoge_image.GetComponent<RectTransform>().localScale = new Vector3(1, 1, 1); 12 hoge_image.AddComponent<Image>().sprite = Resources.Load<Sprite>(imageName); 13 hoge_image.GetComponent<Image>().preserveAspect = true; 14 15 // 呼び出し元へ返す 16 return hoge_image; 17 } 18 19 // 使い方 20 // オブジェクトを生成したいタイミングでここが呼ばれるとする 21 public void Start() 22 { 23 // 生成処理を何度も使いまわせる。変数宣言はあくまでメソッドを使う側に書く 24 GameObject go1 = Init2D("Panel", "image1"); 25 GameObject go2 = Init2D("Panel", "image2"); 26 GameObject go3 = Init2D("Panel", "image3"); 27 } 28}

ちなみにご存知かもしれませんが、上記のコードではstring型の引数objectName, imageNameを取ることで初期化する内容をカスタマイズできるようにしています。C#ではstring型の値、すなわち文字列は""で囲む必要があるのでご注意ください。
それから、メソッド名は数字で始まる名前にすることができません。2DInitという名前は使えないので、上記コードでは代わりにInit2Dとしました。

ご参考になれば幸いです。

投稿2017/11/07 01:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

spawn

2017/11/07 05:36

三名様、本当に有難うございます。 この方法が今のところ私にとっては一番理解がしやすく簡潔に実装可能でありました。また宜しくお願い致します。
guest

0

単純にメソッドにしたい場合……そのまま書けばいいだけだと思いますが。
(メソッド名は数字から開始にできないので変更してます)

C#

1public static GameObject hoge_image; 2 3void Init2D (string parentName, string imageName) { 4 hoge_image.transform.parent = GameObject.Find(parentName).transform; 5 hoge_image.AddComponent<RectTransform>().anchoredPosition = new Vector3(0, 0, 0); 6 hoge_image.GetComponent<RectTransform>().localScale = new Vector3(1, 1, 1); 7 hoge_image.AddComponent<Image>().sprite = Resources.Load<Sprite>(imageName); 8 hoge_image.GetComponent<Image>().preserveAspect = true; 9} 10 11//呼び出し側 12void Hoge () { 13 hoge_image = GameObject.Find("hoge_image"); //ここは適当(何かしらの方法でセットされていると想定する) 14 Init2D("Panel", "image"); //hoge_imageはstaticなので渡す必要は無い 15}

もしかして「imageがセットされたパネルをたくさん作りたい」ということであれば、プレハブを持つのが簡単かと思います。

Imageオブジェクト作成→インスペクタから各種コンポーネントの設定→オブジェクトをプレハブ化
しておいた上で以下のスクリプトを、実行する側のオブジェクトに付けます。

C#

1public GameObject imagePrehab; //インスペクタからプレハブをセットしておく 2 3void Init2D (string objName, string parentName, string imageName) { 4 GameObject obj = Instantiate(imagePrehab, GameObject.Find(parentName).transform); //親子関係セットされる 5 obj.GetComponent<Image>().sprite = Resources.Load<Sprite>(imageName); 6} 7 8//呼び出し側 9void Hoge () { 10 Init2D("hoge_image", "Panel", "image"); 11} 12

public static GameObject hoge_image;にする意図がよく分からなかったので無視しています。

投稿2017/11/07 01:30

編集2017/11/07 01:33
sakura_hana

総合スコア11425

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

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

0

Unityやっていないけど、C#一般なら、

インターフェースと拡張メソッドの組み合わせかな。

参考:
http://www.buildinsider.net/column/iwanaga-nobuyuki/013

あと、定番の初期設定をやってくれなら、ファクトリーパターンを使うというのが定番か。
https://qiita.com/shoheiyokoyama/items/d752834a6a2e208b90ca

投稿2017/11/06 06:32

編集2017/11/06 06:37
kiichi54321

総合スコア1984

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問