Hi all,

Basically I am making a feeding frenzy style game and have encountered a weird bug and can’t figure out what is going on with it.

Upon eating a fish I add 0.2f to my float stored in the player script. After I reach a size around 5-7 the float goes from being 5 or 5.2 etc to 5.999999 and begins to screw up my animation which is set to change when the size is greater than the whole number. (which then in turn affects my collision detection etc)

My code for the Player(parent) is:

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

	// Animator references and Camera
	Animator anim;
	Eat eat;
	SpriteRenderer spr;
	BoxCollider2D pCollider;

	// Variables
	public bool facingRight = false;			// For determining which way the player is currently facing.
	public float Mspeed = 15f;
	public float pSize = 2.0f;
	private float MAXSIZE = 7.0f;

	// Sprite Size Variables
	public  float spriteX = 0f;
	public  float spriteY = 0f;
	public float spriteZ = 0f;

	// Use this for initialization
	void Start () 
	{
		anim = this.GetComponent<Animator>();
		spr = this.GetComponent<SpriteRenderer>();
		pCollider = this.GetComponent<BoxCollider2D>();

		spriteX = spr.sprite.bounds.size.x;
		spriteY = spr.sprite.bounds.size.y;
		spriteZ = spr.sprite.bounds.size.z;
	}
	
	// Update is called once per frame
	void Update () 
	{
		InputControl();
		SizeControl(pSize);
	}

	// Control the players movement
	void InputControl()
	{
		// Left
		if(Input.GetKey("a"))
		{
			rigidbody2D.AddForce(Vector2.right * -Mspeed * Time.fixedDeltaTime);
		}
		if(Input.GetKey("d"))
		{
			rigidbody2D.AddForce(Vector2.right * Mspeed * Time.fixedDeltaTime);
		}
		if(Input.GetKey("w"))
		{
			rigidbody2D.AddForce(Vector2.up * Mspeed * Time.fixedDeltaTime);
		}
		if(Input.GetKey("s"))
		{
			rigidbody2D.AddForce(Vector2.up * -Mspeed * Time.fixedDeltaTime);
		}

		// Cache the horizontal input.
		float h = Input.GetAxis("Horizontal");
		
		// If the input is moving the player right and the player is facing left...
		if(h > 0 && !facingRight)
		{
			// ... flip the player.
			Flip();
		}
		// Otherwise if the input is moving the player left and the player is facing right...
		else if(h < 0 && facingRight)
		{
			// ... flip the player.
			Flip();
		}
	}

	// Flip Sprite
	void Flip()
	{
		// Switch the way the player is labelled as facing.
		facingRight = !facingRight;
		
		// Multiply the player's x local scale by -1.
		Vector3 theScale = transform.localScale;
		theScale.x *= -1;
		transform.localScale = theScale;
	}
	
	// Change the size of the player using the animation 
	void SizeControl(float Size)
	{		
		// Max Size Restraint
		if(pSize > MAXSIZE)
		{
			pSize = MAXSIZE;
		}
		else if(pSize < 2)
		{
			pSize = 2;
		}

		// update our sprite sizes
		spriteX = spr.sprite.bounds.size.x;
		spriteY = spr.sprite.bounds.size.y;
		spriteZ = spr.sprite.bounds.size.z;

		// Set out Size float within the animator to our pSize var
		anim.SetFloat("Size", pSize);
		// Rescale our colliders for the player.
		pCollider.size = new Vector3(spriteX, spriteY, spriteZ);
	}
	
}

My code for the Child object attached to the Player is:

using UnityEngine;
using System.Collections;

public class Eat : MonoBehaviour {

	Player playerScript;
	BoxCollider2D pCollider;

	// box collider sizes these will stay the same
	float bbX1 = 0f;
	float bbX2 = 0f;
	//float bbY = 0f;
	//float bbZ = 0f;

	// Sprite Position
	float pPosX = 0f;
	float pPosY = 0f;
	float pPosZ = 0f;
	
	// Use this for initialization
	void Start () {
		playerScript = (Player)FindObjectOfType(typeof(Player));
		pCollider = (BoxCollider2D)GetComponent(typeof(BoxCollider2D));
	}
	
	// Update is called once per frame
	void Update () 
	{
		// Update our local copies of the player position
		pPosX = playerScript.transform.position.x;
		pPosY = playerScript.transform.position.y;
		pPosZ = playerScript.transform.position.z;

		// update our box sizes based upon the size of the sprite
		// spriteX stores the sprite in use's size
		bbX1 = -((playerScript.spriteX / 2) + -pPosX);
		bbX2 = ((playerScript.spriteX / 2) + pPosX);

		if(!playerScript.facingRight)
		{
			pCollider.transform.position = new Vector3(bbX1, pPosY, pPosZ);
		}
		else if(playerScript.facingRight)
		{
			pCollider.transform.position = new Vector3(bbX2, pPosY, pPosZ);
		}
	}

	void OnCollisionEnter2D (Collision2D col)
	{
		// If the colliding gameobject is an Enemy...
		if(col.gameObject.tag == "Angel_Fish")
		{
			DestroyObject(col.gameObject);
			playerScript.pSize += 0.2f;
		}
	}
}

Also here is a screenshot of the variable output when running the game after the bug occurs.

22324-bug.png

Any ideas as to why this is occurring as I have hit a wall and cannot figure it out.