- Home /
Public class variables not displaying in the inspector
I am using C# and am having trouble having the class, public variables show up in the inspector. I looked around online and found that it should have System.Serializable before the class, but it doesn't seem to help. Any thoughts?
CharacterController_2D.cs
using UnityEngine;
using System.Collections;
public class CharacterController_2D : MonoBehaviour {
public float f_speed = 5.0f;
public SpriteManager[] loopSprites;
private int in_Direction;
// Use this for initialization
void Start () {
in_Direction = 1;
for(int i = 0; i < loopSprites.Length; i++)
{
loopSprites[i].init();
}
Camera.main.transform.position = new Vector3(transform.position.x, transform.position.y, Camera.main.transform.position.z);
}
// Update is called once per frame
void Update () {
if(Input.GetButton("Horizontal"))
{
in_Direction = Input.GetAxis("Horizontal") < 0 ? -1 : 1;
rigidbody.velocity = new Vector3((in_Direction * f_speed),rigidbody.velocity.y,0);
loopSprites[0].resetFrame();
loopSprites[1].UpdateAnimation(in_Direction,renderer.material);
}
else{
loopSprites[1].resetFrame();
loopSprites[0].UpdateAnimation(in_Direction,renderer.material);
}
}
public void LateUpdate()
{
Camera.main.transform.position = new Vector3(transform.position.x, transform.position.y, Camera.main.transform.position.z);
}
}
SpriteManager.cs
using UnityEngine;
using System.Collections;
[System.Serializable]
public class SpriteManager : MonoBehaviour{
public Texture2D spriteTexture;
public int in_framePerSec;
public int in_gridX;
public int in_gridY;
public float f_timePercent;
private float f_nextTime;
private float f_gridX;
private float f_gridY;
private int in_CurFrame;
public void init(){
f_timePercent = 1.0f / in_framePerSec;
f_nextTime = f_timePercent;
f_gridX = 1.0f/ in_gridX;
f_gridY = 1.0f / in_gridY;
in_CurFrame = 1;
}
public void UpdateAnimation(int _direction, Material _material){
_material.mainTexture = spriteTexture;
if(Time.time > f_nextTime)
{
f_nextTime = Time.time + f_timePercent;
in_CurFrame++;
if(in_CurFrame > in_framePerSec)
{
in_CurFrame = 1;
}
}
_material.mainTextureScale = new Vector2(_direction * f_gridX, f_gridY);
int in_col = 0;
if(in_gridY > 1)
{
in_col = (int)Mathf.Ceil (in_CurFrame / in_gridX);
}
if(_direction == 1)
{
_material.mainTextureOffset = new Vector2(((in_CurFrame) % in_gridX) * f_gridX, in_col * f_gridY);
}
else
{
_material.mainTextureOffset = new Vector2(((in_gridX + (in_CurFrame) % in_gridX)) * f_gridX, in_col * f_gridY);
}
}
public void resetFrame(){
in_CurFrame = 1;
}
}
You don't need System.Serializable for $$anonymous$$onoBehaviour-derived scripts.
Your class is either a script (extends $$anonymous$$onoBehaviour, no System.Serializable attribute) or a serialized class (don't extends $$anonymous$$onoBehaviour, with System.Serializable attribute). But you can't have both (it will compile but will not work in the inspector like you expect it to).
Answer by Muuskii · Aug 22, 2012 at 05:30 AM
Are there two classes in the same file? Which class is the file named after? Which one is supposed to show up? Which one is showing up currently?
I modified it by putting it in two seperate files. I'm still having the same problem... I'll update the code to reflect this.
The CharacterController_2D is attached to the player object in the scene. The CharacterController_2d variables are showing up, but in the array where it should have the variables for the class it just says "
You can only set references to one (or several) Sprite$$anonymous$$anager in the array. You cannot acces their variables that way.
You need to add one (or several) Sprite$$anonymous$$anager as component (script) on your GameObject aswell.
Alternative: don't make Sprite$$anonymous$$anager inherits $$anonymous$$onoBehaviour (just make a single class) and use System.Serializable attribute.
Answer by SnowKrown_ · Aug 22, 2012 at 06:43 AM
using System.Collections;
public List<SpriteManager> sprite = new List<SpriteManager>();
This answer is not false by itself, but does not fix the issue here: arrays and list are serialized in the inspector.
Answer by by0log1c · Aug 22, 2012 at 06:11 AM
@Muuskii nailed it. You cannot have two MonoBehaviour in the same file. Break these classes into two files and it'll work just fine.
One could not place a SpriteManager through the inspector and generating one through code create a script without any name - its not working right.
Answer by dave321 · Aug 22, 2012 at 01:53 PM
The problem was that I didn't realize that I have to apply the SpriteManager file to the array within Unity, after splitting it up into two files. I applied the file twice to the Player gameObject and then dragged the SpriteManager component in the inspector onto both items in the array. It now works as it should.
Your answer
![](https://koobas.hobune.stream/wayback/20220613080013im_/https://answers.unity.com/themes/thub/images/avi.jpg)