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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

647閲覧

複数のクラスの同一名メソッドを実行することは可能か

Yukirr4_

総合スコア728

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2020/06/30 13:30

現在、たくさんの種類の敵キャラを作ることを計画しています。
そして、それぞれの敵キャラには「敵キャラすべてにつけるスクリプト」(以下基礎スクリプト)と「そのキャラ専用のスクリプト」(以下独自スクリプト)の2つを作成しています。
基礎スクリプトとは、体力や攻撃力などの一般的なプロパティや、被ダメージや死亡取得など一般的なメソッドを含めたもので、
独自スクリプトは、例えば歩行キャラや飛行キャラなどキャラ独自の移動方法をさせたりするために作っています。

ここで問題があります。
独自スクリプトから基礎スクリプトを参照するのは、ゲームオブジェクトを介して取得することはできるのですが、
基礎スクリプトから独自スクリプトを取得することができません。

理想としては例えば、SerializeFieldなどを使いインスペクター内で*独自スクリプトをアタッチさせておき、
独自スクリプトに含まれている「被弾時の特別な処理(レイジやカウンターなど独自なメソッド)」を
基礎スクリプト**の「被弾処理」で呼び出せたらと思っています。

C#

1public class 基礎 : MonoBehaviour 2{ 3 void Damaged() 4 { 5 //被弾処理 6 (クラス).Damaged(); 7 } 8}

C#

1//敵キャラ 1 種類目の独自スクリプト 2public class 独自1 : MonoBehaviour 3{ 4 基礎 kiso; //基礎は同じゲームオブジェクトに確実にあるので参照可能 5 6 public void Damaged() 7 { 8 //基礎スクリプトの処理に加え、特殊な処理をここで 9 } 10}

上のようにキャラの種類ごとに違う処理(途中までは同じ)を実行させるにはどうすればいいのでしょうか。


イメージとして書いてみました(へたくそですみません)。

イメージ


「すべての処理を基礎スクリプトに書いてしまって、独自スクリプトを消す」というのもやり方の一つだとは思うのですが、できれば基礎スクリプトは複雑にしたくありませんし、
逆に「キャラそれぞれにすべてのコードを書けばいい」とも思ったのですが、やはり敵キャラごとに体力や攻撃など概念が同じなので、それはひとくくりにしてしまった方が後々コンパクトにできるかなと思っています。

不明なクラスにある同一名のメソッドを実行するにはどうすればいいのか教えていただけたら嬉しいです。
どなたかお願いいたします。

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

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

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

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

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

guest

回答2

0

そのために、オーバーライドという仕組みがあります

C#入門/オーバーライド - WisdomSoft

投稿2020/06/30 13:52

y_waiwai

総合スコア87774

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

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

0

ベストアンサー

一つの方法としてinterfaceを使用する方法があります。
基礎スクリプトは共通だと思うので、独自スクリプトの基礎となるinterfaceとして、例えば

public interface OriginalScript { public void Damaged(); }

を用意しておき、独自スクリプトに

//敵キャラ 1 種類目の独自スクリプト public class 独自1 : MonoBehaviour, OriginalScript { 基礎 kiso; //基礎は同じゲームオブジェクトに確実にあるので参照可能 public void Damaged() { //基礎スクリプトの処理に加え、特殊な処理をここで } }

という形で継承することで、基礎スクリプトにOriginalScriptを型とする変数を用意することで、異なるクラス名でもアクセスできるようになります。

public class 基礎 : MonoBehaviour { [SerializeField] private OriginalScript originalScript; void Damaged() { //被弾処理 originalScript.Damaged(); } }

投稿2020/06/30 13:49

yuuyu

総合スコア1139

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問