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

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

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

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

Unity

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

Q&A

解決済

2回答

1518閲覧

【Unity】【Inventory Pro】アイテムを拾い、インベントリに追加・使用したい

913

総合スコア16

Unity3D

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

Unity

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

1グッド

2クリップ

投稿2018/09/17 13:16

編集2018/09/17 13:55

前提・実現したいこと

【前提】
2Dのローグライクゲーム(スマホ対応)を製作中です。(Unityは初心者です)
アイテム周りを「Inventory Pro」で管理出来るようになるのが目標です。
覚えることが多々あるので一先ず、3Dではありますが下記チュートリアル動画で学習しています。
(英語が苦手なので、動画を見ながら手順だけでも覚えようとしています)

https://youtu.be/W2XUF1_oC38?t=312
※最新バージョンのInventory Proの動画はInventoryPro初心者には難しかったので
シンプルな構成のこちらの動画から学習しています。

動画内に登場する「show Object Triggerer」というスクリプトが現在バージョンには存在せず、
動画コメント欄に書かれている「ObjectTriggerItem」「ObjectTriggereItemHolder」
も見当たらないため、動画と同じようにアイテムを拾って使うにはどうすれば良いのか、
またエラーの解決方法について何卒ご教示をお願いできませんでしょうか…。

【質問】
・Inventory Pro(現行バージョン:ver2.5.1)で作成したアイテムを拾う方法、クリックで使用する方法
・エラーメッセージ3つの解決方法

上記を実現するための解決方法

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

・アイテムが拾えない
・ゲーム起動時にエラーが2つ、アイテム接触時にエラーが1つ出る

//エラー1(ゲーム起動時に発生) NullReferenceException: Object reference not set to an instance of an object Devdog.General.PlayerTriggerHandler.Awake () (at Assets/Devdog/General/Player/PlayerTriggerHandler.cs:23) UnityEngine.GameObject:AddComponent() Devdog.General.Player:SetTriggerHandler() (at Assets/Devdog/General/Player/Player.cs:53) Devdog.General.Player:Awake() (at Assets/Devdog/General/Player/Player.cs:18) //エラー2(ゲーム起動時に発生) NullReferenceException: Object reference not set to an instance of an object Devdog.InventoryPro.UnityStandardAssets.ThirdPersonUserControl.Start () (at Assets/Devdog/InventoryPro/Standard Assets/Characters/ThirdPersonCharacter/Scripts/ThirdPersonUserControl.cs:36) //エラー3(プレイヤーがアイテムに接触すると発生) NullReferenceException: Object reference not set to an instance of an object Devdog.General.RangeBestTriggerSelector.GetBestTrigger (Devdog.General.Player player, System.Collections.Generic.List`1 triggersInRange) (at Assets/Devdog/General/Triggers/Selectors/RangeBestTriggerSelector.cs:35) Devdog.General.PlayerTriggerHandlerBase`1[T].UpdateSelectedTrigger () (at Assets/Devdog/General/Player/PlayerTriggerHandlerBase.cs:59)

該当のソースコード C#

/////////////PlayerTriggerHandler.cs(エラー1)///////////////// namespace Devdog.General { public class PlayerTriggerHandler : PlayerTriggerHandlerBase<Collider> { private SphereCollider _sphereCollider; private Rigidbody _rigidbody; protected override void Awake() { base.Awake(); _rigidbody = gameObject.GetOrAddComponent<Rigidbody>(); _rigidbody.useGravity = false; _rigidbody.isKinematic = true; _sphereCollider = gameObject.GetOrAddComponent<SphereCollider>(); _sphereCollider.isTrigger = true; _sphereCollider.radius = GeneralSettingsManager.instance.settings.triggerUseDistance; //エラー部分 }
////////////////////ThirdPersonUserControl.cs(エラー2)/////////////////// namespace Devdog.InventoryPro.UnityStandardAssets { [RequireComponent(typeof (ThirdPersonCharacter))] public class ThirdPersonUserControl : MonoBehaviour, IPlayerInputCallbacks { private ThirdPersonCharacter m_Character; // A reference to the ThirdPersonCharacter on the object private Transform m_Cam; // A reference to the main camera in the scenes transform private Vector3 m_CamForward; // The current forward direction of the camera private Vector3 m_Move; public float walkSpeedMultilpier = 0.5f; protected void Start() { // get the transform of the main camera if (Camera.main != null) { m_Cam = Camera.main.transform; } else { Debug.LogWarning( "Warning: no main camera found. Third person character needs a Camera tagged \"MainCamera\", for camera-relative controls."); // we use self-relative controls in this case, which probably isn't what the user wants, but hey, we warned them! } // get the third person character ( this should never be null due to require component ) m_Character = GetComponent<ThirdPersonCharacter>(); var player = PlayerManager.instance.currentPlayer; //エラー部分 if (player != null) { player.inventoryPlayer.stats.OnStatValueChanged += CharacterCollectionOnOnStatChanged; var stat = player.inventoryPlayer.stats.Get("Default", "Run speed"); if (stat != null) { CharacterCollectionOnOnStatChanged(stat); } } }
////////////////////ThirdPersonUserControl.cs(エラー3)/////////////////// namespace Devdog.General { [CreateAssetMenu(menuName = "Devdog/Range trigger selector")] public class RangeBestTriggerSelector : BestTriggerSelectorBase { /// <summary> /// Item infront has 20% effect on making the best decision /// </summary> public float forwardEffect = 0.2f; /// <summary> /// Get the best trigger based on distance and if it's in front of the player or not. /// </summary> public override TriggerBase GetBestTrigger(Player player, List<TriggerBase> triggersInRange) { float bestCheck = -999.0f; TriggerBase closestTrigger = null; foreach (var item in triggersInRange) { if (item == null || item.enabled == false || item.gameObject.activeSelf == false) { continue; } var toPlayerVec = item.transform.position - player.transform.position; var dist = Vector3.Magnitude(toPlayerVec); float inFrontFactor = Mathf.Clamp01(Vector3.Dot(player.transform.forward, toPlayerVec / dist)); inFrontFactor *= forwardEffect; float final = (GeneralSettingsManager.instance.settings.triggerUseDistance - dist) * inFrontFactor; //エラー部分 final = Mathf.Abs(final); if (final > bestCheck) { closestTrigger = item; bestCheck = final; } } return closestTrigger; } } }

試したこと

メインカメラにPhysicsRaycasterを取り付けました(EventMaskにDefault,Water,UIを活性化)

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

Unity(2017.1.0f3 Personal)
Inventory Pro(ver2.5.1)

ooa👍を押しています

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しました。
Inventory UI(Script)のRestrictions欄でアイテムを拾ったり使ったりする制限をかけるのですが、
そこでインベントリの対象とするアイテムの種類を「Match Any」ではなく「Match All」にしていたため、どうあがいても拾わない状態になっていました(凡ミス!)
ソースコードを確り探すのが大事ですね、いい勉強になりました。

投稿2018/09/21 12:46

913

総合スコア16

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

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

0

エラーだけは消すことが出来ました。
Tool → Devdog → SetUpWizard
ここにまだ設定が終わっていない項目がいくつか存在したため、
Asset側で用意されたものを一つずつ設定した所エラーは消失しました。

しかしながら、まだアイテムを拾ったりインベントリにコピーはされないので
引き続き回答お待ちしております。

投稿2018/09/21 09:15

913

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問