- 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.