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

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

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

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

Unity

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

Q&A

解決済

1回答

2947閲覧

ゲーム中のアイテムに効力を持たせたい

cushionA

総合スコア90

C#

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

Unity

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

0グッド

0クリップ

投稿2020/05/30 11:34

編集2020/05/30 11:36

前提・実現したいこと

アイテム管理の概念について理解し、効力を持つアイテムを作成すること。(魔法や火炎瓶、回復アイテムなど)

発生している問題・エラーメッセージ

アイテム管理について学ぶ上で、どうやらリストにスプライトのデータとアイテム名と説明文などを格納しているのだということが理解できました。
しかしそのアイテムの効果、たとえば回復したり装備して能力を強化したりというような肝心の動作の部分をどう記述すればよいのかわからず困っています。

どうかコーディングする上でのアイデアというか、ヒントをいただければ大変うれしく思います。
お力添えの方よろしくお願いします。

該当のソースコード

下記のようなコードを参考に進めようと思っています。

『UnityでScriptableObjectを使ってアイテムデータベースを作成する』

かめくめ様のブログ『Unityを使った3Dゲームの作り方(かめくめ)』より引用
個々のアイテムを生成するスクリプト

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using System; 6 7[Serializable] 8[CreateAssetMenu(fileName = "Item", menuName="CreateItem")] 9public class Item : ScriptableObject { 10 11 public enum KindOfItem { 12 Weapon, 13 UseItem 14 } 15 16 // アイテムの種類 17 [SerializeField] 18 private KindOfItem kindOfItem; 19 // アイテムのアイコン 20 [SerializeField] 21 private Sprite icon; 22 // アイテムの名前 23 [SerializeField] 24 private string itemName; 25 // アイテムの情報 26 [SerializeField] 27 private string information; 28 29 public KindOfItem GetKindOfItem() { 30 return kindOfItem; 31 } 32 33 public Sprite GetIcon() { 34 return icon; 35 } 36 37 public string GetItemName() { 38 return itemName; 39 } 40 41 public string GetInformation() { 42 return information; 43 }

補足情報(FW/ツールのバージョンなど)

Unity 2019 3,7f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

using UnityEngine.Events; //イベントを使い実行したいときにInvoke()で呼び出す public UnityEvent thisEvent; public void Use() //別のスクリプトで実行するタイミングで関数を呼び出す { thisEvent.Invoke(); } //例えば、Itemクラスでアイテムの数を減らす時は、 public int numberHeld; public void DecreaseAmount(int amountToDecrease)//減らす値を任意で指定 { numberHeld -= amountToDecrease; } //これをそれぞれのScriptableObjectのEventで設定
//例え public class Test : MonoBehaviour { public Item thisItem; void Start() { thisItem.Use();//スタート時に呼び出す } } コード

こんな感じかなぁ。
でも、これだったら、ScriptableObjectでなくてもいい気はするけど、この機能の一番良い所はアイテムを表示してボタン押したら発動するっていうのが良いと思う。

投稿2020/05/31 23:09

BRAK

総合スコア98

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

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

cushionA

2020/06/01 04:28

かなりエスパーな感じの質問にも関わらずスクリプトまで添えてのご回答ありがとうございます。(エスパーになるくらいどうしていいのか分からなかったので本当に助かります) ボタンから上記のイベントを呼び出して使うということでしょうか? なるほど、アイテムの効果をアイテムの情報に含むのではなく、使うという行為を引き金に別の場所から機能を呼び出すというような発想なのでしょうか。 大変参考になりました、ありがとうございました。
BRAK

2020/06/01 04:48

そのとおりです。そっちの方が簡単できれいなコーディングになると思います。
cushionA

2020/06/11 17:53 編集

推測に対するフォローまでしていただき感謝申し上げます。 お陰様でBRAK様の回答の意図がよりよく理解できました。 そして貴重なアドバイスはきっと開発に役立てさせていただきます。 改めて、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問