Unityに関連する記事です

 前回に続いて、属性についての実装処理を行います。今回は以下の内容で順番に実装を進めていきます。

発展35 −フロート表示に属性の要素の運用−
70.FloatingMessage スクリプトを修正し、属性間の相性が弱点である場合には、フロート表示のサイズを大きくする制御を追加する
71.EnemyContorlller スクリプトと DefenseBase スクリプトを修正し、属性間の相性が弱点である場合のフロート表示を大きくする処理を実行する制御を追加する



 新しい学習内容は、以下の通りです。

 ・タプル型の実装例



70.FloatingMessage スクリプトを修正し、属性間の相性が弱点である場合には、フロート表示のサイズを大きくする制御を追加する

1.設計


 フロート表示の演出の一環として、エネミーに対して弱点の属性であるバレットがぶつかった場合、
フロート表示をサイズアップして表示させて、属性による特別感を表現する処理を実装しましょう。

 これは、プレイヤーに対して、エネミー側の攻撃が弱点である場合にも同じような処理をすることで、
通常よりもサイズが大きいフロート表示が出た => これはやばいのかも、という心理的な演出にもつながります。

 属性による相性の判定は実装できていますので、こちらを利用した設計を考えてみます。

 まずは最初に、フロート表示を制御しているメソッドに修正を行い、
弱点である場合には、フロート表示をサイズアップさせる、という処理を追加するようにします。

 弱点であるかどうかは、属性間の相性の判定により判明していますので、その情報を引数として受け取るようにし、
それを元に分岐を用意すれば、外部で判定されている相性の情報を、そのままフロート表示のメソッドでも利用出来るようになります。

 1つ1つの処理を上手くつなげていくコツは、いままでもお伝えしているように、目標となるメソッドを決定し、
そこに至るまでの処理を考えていくと作りやすいと思います。


2.FloatingMessage スクリプトを作成する


 設計を参考にして、修正するべきメソッドに、処理を記述してみてください。
弱点の際にサイズアップする大きさは任意です。2倍くらいを基準に、調整をしていきましょう。


FloatingMessage.cs

 <= クリックすると開きます。


 スクリプトを修正したらセーブします。

 続いては、この修正したメソッドを呼び出している処理も修正を行います。
そうすることによってはじめて処理と処理がつながります。


71.EnemyContorlller スクリプトと DefenseBase スクリプトを修正し、属性間の相性が弱点である場合のフロート表示を大きくする処理を実行する制御を追加する

1.設計

 
 フロート表示の制御を行うメソッドの修正が済みました。新しい引数を用意したことにより、bool 型の情報を受け取ることが出来れば、
それを利用した分岐によって、フロート表示のサイズを自動的に変更することが可能になっています。

 属性間の相性については判定処理が実装できていますので、その処理の結果を利用することが出来れば、
その情報をフロート表示のメソッドに引数として渡すことにより、メソッド内でフロート表示のサイズを変更する処理が分岐により制御されます。

 弱点であるか、あるいは弱点ではないか、という状態を保持することが可能であれば情報としては問題ないので、
属性間の相性の判定結果に合わせて、同じように bool 型で情報を管理するようにロジックを考えてみてください。

 真偽値のどちらの状態を「弱点である」と定義するかは任意です。教材では true の場合を弱点である、として判定しています。
これは相性の判定も true が弱点であるとして定義して利用しているので、それに合わせているためです。


 ロジックをひらめくことが出来れば、プレイヤー側、エネミー側のどちらの実装も同じ方法で実装出来ます。
なお教材では DefenseBase スクリプトの実装例については、新しい方法を紹介しています。


2.EnemyController スクリプトを修正する


 ロジックを考えて、必要な情報を追加して、フロート表示を行うメソッドの引数に
必要な情報を届けられるように処理を実装してください。


EnemyController.cs


 スクリプトを修正したらセーブします。


3.ゲームを実行して動作を確認する


 スクリプトの見直しが終了したら、ゲームを実行して、フロート表示に対しても属性による弱点要素が反映されて、
弱点の場合にはフロート表示のサイズが大きくなる制御が動作しているかを確認します。


<実装動画>
動画ファイルへのリンク



弱点ではない相性のフロート表示



弱点の相性のフロート表示



 無事に実装が出来ましたら、次は、エネミー側からの弱点の判定を、フロート表示に反映させます。


4.DefenseBase スクリプトを修正する


 EnemyContorlller スクリプトの修正と同じ要領でロジックを組んでみてください。

 こちらの場合、エネミーの攻撃種類によって、エネミー本体か、エネミーのバレットかによって分岐があります。
最初はこの分岐に合わせて、重複する処理を書いても構いませんので、がんばって実装をしてみてください。

 その後、統一出来る処理はないか見直しをすることで、ロジックを組み立てる力を養うことが出来ます。
自分で書いた処理でないと、見直しを行うスキルは中々伸ばすことが出来ませんので、是非挑戦してください。



 今回の実装例では、タプル型を実装しています。この型を使わなければ実装できない訳ではありませんが
重複処理をなくした上で、修正箇所を少なく、処理を簡潔に記述することが可能な処理の1つです。

 新しい方法を試そう、という気持ちがないと一歩踏み込んだ知識は入手できませんので、
知らない知識に触れ、それを使ってみる、という機会として教材を活用してください。戻り値も多用しています。


DefenseBase.cs

 <= クリックすると開きます


 スクリプトを修正したらセーブします。


5.<タプル型>


 タプル(tuple)型は C# の持つ機能の1つです。複数のオブジェクトのデータをひとまとめにして管理することができます。
また、戻り値として利用する場合には、複数のオブジェクトのデータを同じようにまとめて戻してくれることが出来ます。
 
<記述例 
  (int, bool) damage = (0, false);

 上記の例の場合、damage 変数には、2つの型の情報が含まれていることになります。
より丁寧に書く場合には、今回のように、通常の変数のように型に対して宣言も可能です。
出来るだけタプル内のオブジェクトの型にも変数の宣言をつけて利用することをおすすめします。

<記述例◆〆2鷦汰分>
  (int value, bool isWeakness) damage = (0, false);



 タプル型の情報を扱う場合、タプル内のオブジェクトに対して変数の宣言を行っているか、いないかによって、参照する場合の記述が変わります

 記述例,里茲Δ法▲織廛詁發之燭里澆靴宣言していない場合には、タプル内の情報は Item1、Item2 というように自動的に採番されます
その場合は、「タプルの変数名.タプル内のオブジェクトの宣言順のItemの番号」の書式で記述できます。

<記述例,両豺腓了仮販磧
  UpdateDurability(damage.Item1);  // int 型の引数を参照して渡しています

 変数の宣言を行っている場合には、通常の変数のように「タプルの変数名.タプル内のオブジェクトの変数名」の書式で記述できます。
そのため、タプルの変数名から、値の推測が可能です。

<記述例△両豺腓了仮販磧
  UpdateDurability(damage.value);  // int 型の引数を参照して渡しています

 Item1、Item2 でも処理は動きますが、プログラムは処理を見て、誰でもすぐに内容が理解できる設計が理想です。
なるべく変数名をつけてタプルの宣言をした方がいいというのは、このようにプログラムの可読性に関わるためです。
damage.Item1 よりも、damage.value の方が、変数名だけ見てもどのような値が代入されているか判断がつきやすいので、処理を読み解きやすいということです。



 今回の処理では、タプル型を戻り値を持つメソッドとしても活用しています。

<右辺で戻り値を持つメソッドの実行命令>
 damage = JudgeDamageToElementType(bullet.bulletData.bulletPower, bullet.bulletData.elementType);

<呼び出されて実行されるメソッドと戻り値の確認>
  private (int, bool) JudgeDamageToElementType(int attackPower, ElementType attackElementType)
 
 JudgeDamageToElementType メソッドの戻り値の型は(int, bool)のタプル型です。
よってこの処理はタプル型 = タプル型になりますので、代入処理が成立しています。
タプル型同士であっても、タプル内の型が異なる場合には代入処理できませんので注意してください。
今回は、(int, bool) = (int, bool) であるため処理が成立しています。

 この処理が実行されると、JudgeDamageToElementType メソッド内において属性間の相性の判定処理が行われて、
その処理結果として、最終的なダメージの値(value)と、弱点かどうか(isWeakness)、という2つの情報が damage 変数に代入されることになります。


参考サイト
MicroSoft C#リファレンス
タプル型
https://docs.microsoft.com/ja-jp/dotnet/csharp/lan...


6.ゲームを実行して動作を確認する


 スクリプトの見直しが終了したら、ゲームを実行して、属性による弱点要素がゲーム内に反映されているか、確認します。
プレイヤーの属性は使用しているバレットの属性に依存しますので、エネミーが拠点に侵入した際に、
どのバレットを選択しているかによって、弱点であったり、弱点でなかったりと、相性が判定されて制御がされていれば成功です。


<実装動画>
動画ファイルへのリンク



 ゲームを一時停止しながら、フロート表示のサイズに弱点の効果が反映されているか確認してください。


弱点ではない相性のフロート表示のサイズ



弱点の相性のフロート表示のサイズ



 以上でこの手順は終了です。

 次は 発展36 −バレット選択ボタンに属性の情報を反映− です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます