- Home /
Junior Programming Pathway scaling a cube
In the junior programming pathway for the "mod the cube" assignment, I'm trying to have the cube scale up incrementally by 0.1 until it reaches a certain size, then scale back down by the same increment.
My function for doing this has no errors but the result isn't what I want.
It starts the cube at 0 and scales up by 0.1 to 9.00001 which is below the lower bound of the range I've set and then it gets stuck. I've tried changing the value of scaleCube and changing the second if to an else if statement plus a few other things but it still gets stuck at the same number. Could someone help direct me towards making my function work as intended?
{
public MeshRenderer Renderer;
private float scaleCube;
void Start()
{
//default script code is here
}
void Update()
{
scaleCube = cubeScale(scaleCube);
Debug.Log(scaleCube);
transform.localScale = Vector3.one * scaleCube;
transform.Rotate(10.0f * Time.deltaTime, 0.0f, 0.0f);
}
private float cubeScale(float x)
{
float maxRange = 5;
float minRange = 1;
float currentBound = 1;
if (x <= currentBound)
{
x = x + 0.1f;
if (currentBound >= maxRange)
{
currentBound = minRange;
}
}
if (x >= currentBound)
{
x = x - 0.1f;
if (x <= currentBound)
{
currentBound = maxRange;
}
}
return x;
}
}
I don’t see how this would get past a local scale of Vector3(1,1,1).
Answer by Narc0t1CYM · Mar 20 at 01:38 PM
Your loop is stuck in an infinite loop because as soon as it reaches 1.0f
, it goes to your next part of code which will decrease x
by 0.1f
then when the code runs again it will increase it by 0.1f
to 1.0f
, but then it reached currentBound
again so it goes on to your next part of the code which decreases x
by 0.1f
and so on.
What I'd suggest you having in a case like this is either a bool
that is checking whether it's incrementing or not, or a more readable, elegant way - especially if your cube would have another state then increasing and decreasing - is to use an enum
.
While your _scaleState
is set to Increasing
it will increase x
by the given amount until it reaches your maxRange
and then it will set _scaleState
to Decreasing
which will run the other part of your code that is decreasing x
. Once x
reaches minRange
, _scaleState
switches back to Increasing
thus completing a full circle.
I provided you a code below that would fit this scenario:
using UnityEngine;
public class CubeScaler : MonoBehaviour
{
public MeshRenderer Renderer;
private float _scaleCube;
enum ScaleState
{
Increasing,
Decreasing
}
private ScaleState _scaleState;
void Start() {
_scaleState = ScaleState.Increasing;
}
void Update()
{
_scaleCube = cubeScale(_scaleCube);
Debug.Log(_scaleCube);
transform.localScale = Vector3.one * _scaleCube;
transform.Rotate(10.0f * Time.deltaTime, 0.0f, 0.0f);
}
private float cubeScale(float x)
{
float maxRange = 5;
float minRange = 1;
if (_scaleState == ScaleState.Increasing) {
if (x >= maxRange) {
_scaleState = ScaleState.Decreasing;
}
x += 0.1f;
}
if (_scaleState == ScaleState.Decreasing) {
if (x <= minRange) {
_scaleState = ScaleState.Increasing;
}
x -= 0.1f;
}
return x;
}
}
Answer by rh_galaxy · Mar 20 at 01:44 PM
This will do ping pong between scale 1 and 5 with descrete steps of 0.1 every 0.2 second (Untested). You are currently tying to change the scale with 0.1 every frame, which I suspect is not what you want, it will be changing scale to quickly.
private float way = 1.0f;
private float timer = 0.0f;
private float cubeScale(float x)
{
timer += Time.deltaTime;
if(timer >= 0.2f) //do scaling change in 0.2S time steps
{
timer = 0.0f;
x += way * 0.1f;
if(x >= 5.0f) { x=5.0f; way *= -1.0f; }
if(x <= 1.0f) { x=1.0f; way *= -1.0f; }
}
return x;
}
Your answer
Follow this Question
Related Questions
How to instantiate Road Prefab at desired position ? 1 Answer
looking for a way to set an integer to another number based on a condition. 2 Answers
Trying to find the highest number than add it to itself. 2 Answers
How to get multiple string values from override ToString()? 1 Answer
How do I make a photography function? 0 Answers