###目的
タイトルのエラーの解決、または原因の明確化
###問題となっていること
参考書に記載のスクリプト(以下のEnemyStatusとMobAttack)を作りたての3dオブジェクト(cube)にaddしようとすると、"The script does not contain a class derived from UnityEngine.Monobehavior"というエラーが出てきてしまいます。
以下のソースは参考書からの原文のままですが、自分が使っているバージョンに合わせて
using System.Collections;
using System.Collections.Generic;
などのコードを追加してみてもダメでした。
該当のソースコード
MobAttackスクリプト
C#
1using System.Collections; 2using UnityEngine; 3 4[RequireComponent(typeof(MobStatus))] 5public class MobAttack : MonoBehaviour 6{ 7 [SerializeField] private float attackCooldown = 0.5f; 8 [SerializeField] private Collider attackCollider; 9 10 private MobStatus _status; 11 // Start is called before the first frame update 12 private void Start() 13 { 14 _status = GetComponent<MobStatus>(); 15 } 16 17 public void AttackIfPossible() 18 { 19 if (!_status.IsAttackable) return; 20 _status.GoToAttackStateIfPossible(); 21 } 22 23 /// <param name="collider"></param> 24 public void OnAttackRangeEnter(Collider collider) 25 { 26 AttackIfPossible(); 27 } 28 29 public void OnAttackStart() 30 { 31 attackCollider.enabled = true; 32 } 33 34 ///<param name="collider"></param> 35 public void OnHitAttack(Collider collider) 36 { 37 var targetMob = collider.GetComponent<MobStatus>(); 38 if (null == targetMob) return; 39 targetMob.Damage(1); 40 } 41 42 public void OnAttackFinished() 43 { 44 attackCollider.enabled = false; 45 StartCoroutine(CooldownCoroutine()); 46 } 47 48 private IEnumerator CooldownCouroutine() 49 { 50 yield return new WaitForSeconds(attackCooldown); 51 _status.GoToNormalStateIfPossible(); 52 } 53}
EnemyStatusスクリプト(MobStatusクラスの継承先)
C#
1using System.Collections; 2using UnityEngine; 3using UnityEngine.AI; 4 5[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))] 6public class EnemyStatus : MobStatus 7{ 8 private UnityEngine.AI.NavMeshAgent _agent; 9 // Start is called before the first frame update 10 protected override void Start() 11 { 12 base.start(); 13 14 _agent = GetComponent<UnityEngine.AI.NavMeshAgent>(); 15 } 16 17 // Update is called once per frame 18 private void Update() 19 { 20 _animator.SetFloat("MoveSpeed", _agent.velocity.magnitude); 21 } 22 protected override void OnDie() 23 { 24 base.OnDie(); 25 StartCoroutine(DestroyCoroutine()); 26 } 27 28 /// <returns></returns> 29 private IEnumerator DestroyCoroutine() 30 { 31 yield return new waitForSeconds(3); 32 Destroy(gameObject); 33 } 34}
MobStatusスクリプト(EnemyStatusクラスの継承元)
C#
1 2using UnityEngine; 3 4public abstract class MobStatus : MonoBehaviour 5{ 6 7 protected enum StateEnum 8 { 9 Nomal, 10 Attack, 11 Die 12 } 13 14 public bool IsMovable => StateEnum.Normal == _state; 15 public bool IsAttackable => StateEnum.Normal == _state; 16 public float LifeMax => lifeMax; 17 public float Life => _life; 18 //上から移動可能かどうか、攻撃可能かどうか判断、ライフ最大値、ライフの値を返す 19 20 [SerializeField] private float lifeMax = 10; 21 protected Animator _animator; 22 protected StateEnum _state = StateEnum.Normal; 23 private float _life; //現在のライフ数 24 25 // Start is called before the first frame update 26 protected virtual void Start() 27 { 28 _life = lifeMax; 29 _animator = GetComponentInChildren<Animator>(); 30 } 31 32 protected virtual void OnDie() //死ぬ時 33 { 34 } 35 36 ///<param name="damage"></param> //指定値のダメージ 37 public void Damage(int damage) 38 { 39 if (_state == StateEnum.Die) return; 40 41 _life -=damage; 42 if (_life > 0) return; 43 44 _state = StateEnum.Die; 45 _animator.SetTrigger("Die"); 46 47 OnDie(); 48 } 49 50 public void GoToAttackStateIfPossible() //可能なら攻撃状態に移行 51 { 52 if (!IsAttackable) return; 53 54 _state = StateEnum.Attack; 55 _animator.SetTrigger("Attack"); 56 } 57 58 public void GoToNormalStateIfPossible() 59 { 60 if (_state == StateEnum.Die) return; 61 _state = StateEnum.Normal; 62 } 63} 64
試したこと
unity使用経験のある友人のコミュニティーで質問してもバージョンに問題があるかもしれないと言われるだけで、明確な回答には辿り着きませんでした。
ネットでエラー内容の検索もかけてみましたが、同じようなエラーになっている人がなかなかいなく、唯一のものが海外の方のこの質問。やはりバージョンに問題があるのでしょうか。
https://community.gamedev.tv/t/does-not-contain-a-class-derived-from-unityengine-monobehaviour/154992/2
補足情報(FW/ツールのバージョンなど)
記載のスクリプトの動作検証バージョンは2019.3.0f1、自分のバージョンは2021.1.4f1です。
当方、このスクリプトが載っている参考書でunityに初めて手をつけた初心者です。そのため、バージョン更新に関する影響についての知識が皆無でして....
古いバージョンで作り直すしかないのならそれでもいいんですが、どこが問題なのかわからないままにしておいても経験にならないと思い、今回質問させていただきました。
どうかご教授お願いいたします。
回答1件
あなたの回答
tips
プレビュー