実現したいこと
複数いるプレイヤーを切り替え、操作対象のプレイヤーを入力操作によって変更する機能を実装したいと考えています。ですが、課題が多く、アーキテクチャレベルのアイデアを募集したいと思っております。
プレイヤが操作しないキャラクターが自律的に動くので、メインキャラとサブキャラで分けております。
発生している問題・分からないこと
下記図のようにしようかとも思いましたが、スキルという概念があり、このままではAもBもCも全員処理が変わらず、実現が難しいです。
アイデアを模索しておりますので、何卒ご協力いただけるとありがたいです。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
chatgptにて質問をしましたが、拡張性のないコードしか出てきませんでした
補足
unityのバージョンは2021.3.20f1です。
正直,文章から話の内容を把握するのが困難に思えます.
> 複数いるプレイヤー
→「プレイヤー」という何かは複数存在する
> 操作対象のプレイヤーを入力操作によって変更
→「プレイヤー」というのは「操作」の対象となる(ここでの「操作」する者とは 誰/何 ?)
> プレイヤが操作しないキャラクターが自律的に動く
→「キャラクター」というまた別の存在が登場
→「プレイヤ(プレイヤー と同一か?)」は「キャラクター」を操作する
> メインキャラ, サブキャラ,スキル
→これらの単語の意味や,話との繋がりは全くわからない
> このままではAもBもCも全員処理が変わらず
→何故「処理が変わらず」という状態になるのかが全くわからない
→それ以前に A,B,C とは何なのか? 「プレイヤー」なのか「キャラクター」なのかまた別の何かなのか?
> Move関数
→何らかの関数であろうが,その内容は質問者しか知らないわけで,関数名だけ示されても全く意味不明
> chatgptにて質問をしましたが、拡張性のないコードしか出てきませんでした
→何らかの「拡張性」を求めている,ということであれば,求めている「拡張性」とは何か? を具体的に述べるべきでは.(あなたが求めている「拡張性」を有しない回答を避けるために)
> AもBもCも全員処理が変わらず
雰囲気的にはおそらくコレが困っていることなのだろうと思うのだが,
【「操作」されるのか「自律的に動く」のかというのをどうやって切り替えるのか】という問題と
【処理が変わらない】という問題は
独立した事柄であるように思える(両者の関連性がわからない).
仮に全てが「自律的に動く」のだとしたら,【処理が変わらない】という問題は生じないのであろうか?
生じないとしたらそれは何故か?
まずここからの話でのプレイヤとは、実際にゲームをプレイする人たちのことで、キャラクタというのはゲーム内でプレイヤが操作を行うことによって動く、攻撃する、アニメーションが流れるといったゲーム内のオブジェクトのことをを指します。言葉足らずだったことは申し訳ございません。
そして、操作対象のプレイヤを変更のところは、操作対象のキャラクタの誤りであり、例えばキャラクタA、B、Cがいるとき、最初プレイヤが操作するのはキャラクタAであり、そこからプレイヤがボタンやキーを押すと操作するキャラクタがAからBやCに変更されます。(この場合の操作とは、WASDで移動、スペースキーで攻撃といった操作対象であるキャラクターを動かすことです。)その際に、操作していない、例えばキャラクタAを操作している場合、残りのBとCはキャラクタAに追従し、敵が現れれば自動的に攻撃を行わせたいです。
プレイヤが操作しているキャラクタ(上記の例で言えばA)のことをメインキャラ、それ以外のキャラクタ(上記の例で言えばB、 C)のことをサブキャラと呼んでいます。そして図の解説ですが、Move関数というのはキャラクタをプレイヤが操作するスクリプト(今のプロジェクトではAddForceを使っております)のことで、メイン変数にはメインキャラを、サブ変数にはサブキャラを代入し、メイン変数.Moveと宣言することで、メイン変数に入っているキャラクタのみのMove関数が実行されるという仕組みを考えています。
そこで、スキルというものが障害になってしまいます。ただ攻撃するだけだとゲームに面白みが出ないので、クールダウンがある、通常の攻撃よりも強い攻撃としてスキルというものを実装しているのですが、仮に上記のMove関数のような方法でSkill関数(スキルを打ち、攻撃の判定を出す関数だと思ってもらって大丈夫です。)を作ると、キャラクタによってスキルが違うので、同じSkill関数を呼び出してしまうと、処理も同じになってしまうのでは?と思いこの質問をいたしました。
拡張性の面については、拡張性のないというところが少し語弊を生んでしまったかもしれません。
これは私の言語能力の問題なのですが、少し説明しにくいので一旦無視していただいて構いません。(1+1=1と答えられている気分と言って伝わればそれでいいのですが、伝わらなければ構いません。)
言葉足らずなところが多く、申し訳ございませんでした。
長文で大変読みにくくなってしまい申し訳ございません。
こちらはわからん点を列挙して問うているだけなので,謝る必要はありません.
話の内容をより分かり易い形にできる/誤記を修正できる 等の場合には,質問文を修正されると良いと思います.
今現在,【 A,B,C や メイン変数,サブ変数 の実装としてどのような「型」を考えているのか?】
という話を質問文にある程度具体的な(私の回答にある程度の)コードの形で示すと良いのではないかと思います.
「処理が変わらない/同じになってしまう」という点はそのへんに根差しているように思えるので.
(図や文章だけではそこは伝わらない部分だと思います)
質問のタグが相応しくなさそうです。
"RPG"というのは、ゲームジャンルのRPGではなく、プログラミング言語のRPGのことなので、この質問には無関係です。タグを消してください。
数日間応答がありませんが,
> 同じSkill関数を呼び出してしまうと、処理も同じになってしまうのでは?
というのは,要は,「見た目が同じ XXX.Skill() みたいな呼び出しコードを書いても個々が別の処理を行うようにするにはどうすればよいのか?」という話なのかと想像します.
やり方は複数あるでしょう.
回答では interface を挙げましたが,例えばもっと単純に「Skill() の内部に if とか switch による分岐を設ける」とかでも達成はできるでしょう.
まず最も単純な方法でちょっとやってみて,それだと何か問題が生じたならば,その具体的な問題点に焦点を絞った質問などをされると良いのではないでしょうか.