- Home /
How to update assigned vector variable in unity C#
I am creating a 2D game but I can't seem to be able to have the speed vector variable change if something happens.
I have a timer variable that counts down and when it hits 0 it is supposed to change the speed: speed.x += 100 and speed.y += 100 but it does not do anything. I know the countdown works because I have tested it with other functions.
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
/// <summary>
/// Parallax scrolling script that should be assigned to a layer
/// </summary>
public class Scrolling : MonoBehaviour
{
public float timeLeft = 5.0f;
/// <summary>
/// Scrolling speed
/// </summary>
public Vector2 speed = new Vector2(10, 10);
/// <summary>
/// Moving direction
/// </summary>
public Vector2 direction = new Vector2(-1, 0);
/// <summary>
/// Movement should be applied to camera
/// </summary>
public bool isLinkedToCamera = false;
/// <summary>
/// 1 - Background is infinite
/// </summary>
public bool isLooping = false;
/// <summary>
/// 2 - List of children with a renderer.
/// </summary>
private List<Transform> backgroundPart;
// 3 - Get all the children
void Start()
{
// For infinite background only
if (isLooping)
{
// Get all the children of the layer with a renderer
backgroundPart = new List<Transform>();
for (int i = 0; i < transform.childCount; i++)
{
Transform child = transform.GetChild(i);
// Add only the visible children
if (child.renderer != null)
{
backgroundPart.Add(child);
}
}
// Sort by position.
// Note: Get the children from left to right.
// We would need to add a few conditions to handle
// all the possible scrolling directions.
backgroundPart = backgroundPart.OrderBy(
t => t.position.x
).ToList();
}
}
void Update()
{
//Timer
timeLeft -= Time .deltaTime ;
if (timeLeft <= 0.0f)
{
speed.x += 100;
speed.y += 100;
}
// Movement
Vector3 movement = new Vector3(
speed.x * direction.x,
speed.y * direction.y,
0);
movement *= Time.deltaTime;
transform.Translate(movement);
// Move the camera
if (isLinkedToCamera)
{
Camera.main.transform.Translate(movement);
}
// 4 - Loop
if (isLooping)
{
// Get the first object.
// The list is ordered from left (x position) to right.
Transform firstChild = backgroundPart.FirstOrDefault();
if (firstChild != null)
{
// Check if the child is already (partly) before the camera.
// We test the position first because the IsVisibleFrom
// method is a bit heavier to execute.
if (firstChild.position.x < Camera.main.transform.position.x)
{
// If the child is already on the left of the camera,
// we test if it's completely outside and needs to be
// recycled.
if (firstChild.renderer.IsVisibleFrom(Camera.main) == false)
{
// Get the last child position.
Transform lastChild = backgroundPart.LastOrDefault();
Vector3 lastPosition = lastChild.transform.position;
Vector3 lastSize = (lastChild.renderer.bounds.max - lastChild.renderer.bounds.min);
// Set the position of the recyled one to be AFTER
// the last child.
// Note: Only work for horizontal scrolling currently.
firstChild.position = new Vector3(lastPosition.x + lastSize.x, firstChild.position.y, firstChild.position.z);
// Set the recycled child to the last position
// of the backgroundPart list.
backgroundPart.Remove(firstChild);
backgroundPart.Add(firstChild);
}
}
}
}
}
}
The way you do it should work, why don't you output the value of speed to see what happens?
Debug.Log("$$anonymous$$y Speed: " + speed);
Add that before and after, that way you can debug what happens.
At a quick glance your code seems ok, but havent really analysed it that much so it may be something in yuor logic that does not work.
Are you resetting the timeLeft-variable anywhere? Looks like once 5 seconds have passed, speed starts to grow by 100 every Update. Of course this should cause a different problem than "it does not do anything" as you put it :-/ Unless it creates an illusion where the framerate matches the repetitive pattern in the background or something...
Answer by markedagain · Jun 05, 2014 at 03:08 PM
you are not reseting timeLeft
i would think it should look like
timeLeft -= Time .deltaTime ;
if (timeLeft <= 0.0f)
{
speed.x += 100;
speed.y += 100;
timeLeft = 5.0f
}
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Unity Sprites Overlapping, slightly see-through (2D game) 2 Answers
Unity minecart 2d idea 1 Answer
How do I use MoveTowards in 2d? 1 Answer
Creating 2D art in a 3D world 3 Answers