개발블로그
[유니티 에러] 'ClassName' is missing the class attribute 'ExtensionOfNativeClass'! 본문
[유니티 에러] 'ClassName' is missing the class attribute 'ExtensionOfNativeClass'!
dvmoo 2021. 7. 18. 19:23
🤦♀️꼬리에 꼬리를 무는 버그
코드는 최대한 깔끔하게 작성하는 것이 좋다.
그래서 한번 작성한 코드도 다시 한번 리팩토링을 거쳐서 깔끔하게 정리하는 습관을 들이는 것이 좋은데,
지난 번에 작성한 짧은 코드를 리팩토링하며 새로운 에러가 발생했다.
(리팩토링이라 하기에도 상당히 짧지만... 이 짧은 코드에서 뭔가 변경할 때마다 하나씩 터져 나오는 버그들)
✔ 문제의 코드
그냥 봐서는 전혀 문제가 없어보인다. 인텔리센스도 오류 줄을 표시하지 않기 때문에 더욱 당황스럽다. 그림-1
그렇다면 왜 실행이 안되는걸까?
Study Coord 클래스는 하이어라키뷰에서 게임오브젝트에 들어있는 스크립트다. 그림-2
내가 이 코드를 리팩토링하며 변경한 부분은 MonoBehaviour를 삭제한 것과 라인 줄 맞춤을 정리한 것 외에는 없다.
MonoBehaviour를 다시 추가 해보자.
오류가 사라졌다!
런타임에서 정상적으로 실행도 잘 된다.
🤷♀️ 왜 이런 오류가 발생한걸까?
구글링을 통해 찾아본 결과는 내가 작성한 'StudyCoord.cs' 스크립트에 클래스 속성이 없어서 오류가 발생했던 것이다.
단계별로 풀어서 쉽게 말하면,
(1) 하이어라키 뷰에 등록한 게임오브젝트에 스크립트를 연결한 후에 컴파일러한테 실행하라고 명령을 내렸다.
(2) 컴파일러가 이제 내 클래스를 실행하려고 살펴본다.
(3) 근데 이 스크립트 안의 클래스를 살펴보니 "클래스 속성이 없네? 나 실행 못해!" 하고 에러를 뿌린 것.
결론은 하이어라키뷰에 들어가는 스크립트는 반드시 MonoBehaviour 클래스 속성이 있어야 한다는 것!
(꼬리에 꼬리를 무는 궁금증)
🤷♀️ 그럼 MonoBehaviour가 포함된 클래스를 상속 받으면?
간단하게 Super클래스 Entity.cs와 자식 클래스 Moster.cs 를 작성해서 확인해 보았다.
Entity.cs
using UnityEngine;
public class Entity : MonoBehaviour
{
[SerializeField] GameObject _gbjBody = null;
void Start()
{
_gbjBody.GetComponent<Rigidbody>();
}
public void Jumping(float power)
{
_gbjBody.GetComponent<Rigidbody>().AddForce(Vector3.up * power);
}
}
Monster.cs
using UnityEngine;
public class Monster : Entity
{
[SerializeField] float _jumpPower = 0f;
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
Jumping(_jumpPower);
Debug.Log("I'm Monster. Jumping Monster!!");
}
}
}
Entity들은 모두 점프를 할 수 있고, 캐릭터마다 점프하는 파워는 모두 다르다.
Entity 클래스를 상속 받은 Monster클래스가 스페이스 바를 누르면 점프할 수 있도록 간단한 코드를 작성했다.
Moster 게임오브젝트에 Moster.cs 를 연결해준 뒤, 점프 파워를 입력해준 뒤 실행한다.
현재 Super Class인 Entity는 하이어라키뷰에 없지만 Monster 클래스는 그의 속성까지 상속 받았기 때문에 정상적으로 실행된다!
* 공부하는 단계입니다. 잘못된 정보가 있다면 피드백 부탁드립니다😊
* e-mail : heehee970@naver.com