前提・実現したいこと
【前提】
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)

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。