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

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

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

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

Unity

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

Q&A

解決済

1回答

2850閲覧

unityで他ゲームオブジェクトにアタッチされたスクリプトをそのままコピーして使いたい

yac_game

総合スコア5

C#

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

Unity

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

0グッド

0クリップ

投稿2022/05/01 04:45

unity初心者です。大変初歩的な質問で申し訳ありませんが半日以上出来ず困り果てているのでご教授頂けると幸いです。よろしくお願い致します。
unityであるゲームオブジェクト(名前:ゲームオブジェクトA)にゲーム開始時からアタッチされて実行されているC#スクリプト(名前:Aスクリプト)をゲームプレイ中にコピーして使用したいです。C#スクリプト名を指定してアタッチする方法はインターネットで調べて出てきたのですが、中の値はもちろんリセットされてします。コピーしたあとゲームオブジェクトAのAスクリプトは削除し、いわばリレー方式で使用したいのです。

初歩的な質問で大変恐縮です。ご教授何卒お願い致します。

c#

1//Aとは違うゲームオブジェクト 2 別ゲームオブジェクト.AddComponent<Aスクリプト>(); 3//ゲームオブジェクトA 4 GameObject.Destroy(this.GetComponent<Aスクリプト>());

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

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

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

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

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

len_souko

2022/05/02 06:31 編集

質問ですが、 ①このAスクリプトは常に一つが生きているのでしょうか? それとも、 ②常におおもとが存在して、それを元に複製したスクリプトが展開されるのでしょうか? ※②の場合は、おおもとのデータは変化せず、複製したスクリプトはそれぞれ変化するもおおもとには反映されないため、おおもとから複製したものは常に同じ値で、複製からさらに複製があれば途中で変化した値も引き継ぐ ①の場合でしたらstaticもしくはシングルトンを使用するというのが定番かとは思います ②の場合はあまり想定されない為、お約束のやり方というのはなさそうですので、自力で考えて実装する必要があると思います ×ご教授 〇ご教示
yac_game

2022/05/02 16:20

len_souko様 コメントありがとうございます。更にご教示まで訂正して頂きまして誠にありがとうございます。教えて頂かなかったらこれから先もずっと間違えて書くところでした。ありがとうございます。 頂いた質問ですが、1になります。たしかにstaticやシングルトンでこまめに行えば確実ですね。最悪の場合はそうさせて頂きます。
len_souko

2022/05/02 19:30

最悪と言うより、最良のような気がしますが>>シングルトン ただ、何かしらの目的があってシングルトン以外の手段で行いたいというのであれば・・・ 処で、Aスクリプトは固定のクラスが対象でしょうか?それとも汎用的に対応したいのでしょうか? 固定であるのならば、引数でAスクリプトのインスタンス(引継ぎデータ元オブジェクト)を受け取り、内部で値の複製を行うメソッドを用意すれば如何でしょうか? 直感ですが、リフレクションを使った場合だとMonoBehaviourが噛んでいるのでフィールドコピーだとgameObjectなんかもコピーしようとして親GameObjectがすげ変わった後に親GameObjectが破棄されてしまうのでは?とか思ってるんですが
yac_game

2022/05/03 14:32

len_souko様 ありがとうございます。初心者なので楽をしようとしましたが、ご助言通り楽をせず一つ一つ処理をしていきたいと思います。 Aスクリプトは汎用的にしたく存じます。おっしゃるとおり、親GameObjが破棄されてしまうのは阻止したく、試行錯誤しております。
guest

回答1

0

ベストアンサー

これは面倒ですね。Unity Editor 的には Copy Component でできる操作ですが、Unity では内部的にコンポーネントを直接入れ替えるということはできないようです。つまり、こういうこと

csharp

1using UnityEngine; 2 3public class MoveComponent : MonoBehaviour 4{ 5 [SerializeField] Dummy _component = default; 6 [SerializeField] GameObject _target = default; 7 8 public void Move() 9 { 10 var c = _target.AddComponent<Dummy>(); 11 c = _component; // これでコンポーネントは置き換わらない 12 } 13}

をしてもコンポーネントは置き換わりません。(できないならこういう操作をしたら警告でも出して欲しいところですが)
ではどうするのか、というと新たに追加されたコンポーネントに対して「フィールド(メンバ変数)を全てコピーする」という操作をしなければなりません。

それを汎用的にやる方法が、こちら

で紹介されています。

投稿2022/05/01 05:20

編集2022/05/01 05:25
bboydaisuke

総合スコア5270

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

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

yac_game

2022/05/01 16:55

bboydaisuke様 早速のご回答誠にありがとうございます。ご親切にお言葉を頂き、本当に有り難く存じます。 頂いたURL先は難しかったので頂いたヒントを元に自分なりに調べ下記のサイト様を見つけました。 https://note.com/dobunezumi06/n/n57297d6ebe4f 考え方としては同じかと思い、これを元に今までやってみたのですが上手くいきませんでした……。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問