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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

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

Q&A

解決済

1回答

2373閲覧

エラー:the script does not contain a class derived from UnityEngine.Monobehaviorの解決方法が知りたいです

krsm_culture

総合スコア0

Unity3D

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

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

0グッド

0クリップ

投稿2021/06/26 16:00

###目的
タイトルのエラーの解決、または原因の明確化

###問題となっていること
参考書に記載のスクリプト(以下の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に初めて手をつけた初心者です。そのため、バージョン更新に関する影響についての知識が皆無でして....
古いバージョンで作り直すしかないのならそれでもいいんですが、どこが問題なのかわからないままにしておいても経験にならないと思い、今回質問させていただきました。
どうかご教授お願いいたします。

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

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

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

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

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

tsuki01

2021/06/27 03:15

表題のエラーは出なかったのですが、提示されている3つのスクリプト全てで打ち間違えによるスクリプトエラー出てませんでしょうか? それが根本原因になってるかは分かりませんが、修正してみた後に質問内容を再度変更願います(質問文のコード修正と、それでもエラーが出るならその旨追記して頂きたい) ・MobAttackスクリプト  45行目:StartCoroutine(CooldownCoroutine()); // 関数"CooldownCouroutine"のスペル誤り ・EnemyStatusスクリプト  12行目:base.start(); // "start"でなく、"Start"  31行目:yield return new waitForSeconds(3); // "waitForSeconds"でなく、""WaitForSeconds" ・MobStatusスクリプト  Normal定義箇所全て // "Normal"でなく、"Nomal"
krsm_culture

2021/06/27 03:50

指摘箇所を修正したところ、無事にaddできました。 というか、consoleにもしっかりエラー出てました^^; ご指摘、ありがとうございます。
guest

回答1

0

自己解決

consoleを確認して構文エラーを修正する。
関数の頭文字を大文字にする、変数の文字ミスを修正するなど。

投稿2021/06/27 03:52

krsm_culture

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問