hello, i will briefly explain my situation:
i have a script that:
- gets the mouse position twice;
- calculates the magnitude and the
angle of the line between the two
points; - istantiates a prefab at the first
position - a coroutine that scales the prefab
along the line (var lengthC)
the problem is that when i istantiate a new object before the scaling of the other
object is complete, i suppose that the variable lengthC gets updated and the previous coroutine stops.
is there a way to get around it?
can i like call the variable inside the coroutine and while it is executing the variable will have a fixed value?
here is the code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnaCresci : MonoBehaviour
{
[SerializeField] GameObject myCube;
[SerializeField] float width = 1f;
[SerializeField] float height = 1f;
[SerializeField] Vector3 inputPosA = Vector3.zero;
[SerializeField] Vector3 inputPosB = Vector3.zero;
[SerializeField] Vector3 result;
[SerializeField] Vector3 avoidBehindCamera;
private GameObject thisCube;
private float lengthC;
[SerializeField] float growFactor = 0.1f;
// Use this for initialization
void Start()
{
avoidBehindCamera.z = 10f;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
inputPosA = Camera.main.ScreenToWorldPoint(Input.mousePosition + avoidBehindCamera);
}
if (Input.GetMouseButtonUp(0))
{
inputPosB = Camera.main.ScreenToWorldPoint(Input.mousePosition + avoidBehindCamera);
SpawnAlongLine();
}
}
void SpawnAlongLine()
{
// Vector3 posC = ((inputPosB - inputPosA) * 0.5F) + inputPosA;
lengthC = (inputPosB - inputPosA).magnitude;
float sineC = (inputPosB.y - inputPosA.y) / lengthC;
float angleC = Mathf.Asin(sineC) * Mathf.Rad2Deg;
if (inputPosB.x < inputPosA.x) { angleC = 0 - angleC; }
Debug.Log("inputPosA" + inputPosA + " : inputPosB" + inputPosB + /*" : posC" + posC + */" : lengthC " + lengthC + " : sineC " + sineC + " : angleC " + angleC);
thisCube = Object.Instantiate(myCube, inputPosA, Quaternion.identity);
thisCube.transform.rotation = Quaternion.Euler(0, 0, angleC);
thisCube.transform.parent = null;
StartCoroutine(Scale());
}
IEnumerator Scale()
{
float timer = 0;
while (lengthC > thisCube.transform.localScale.x)
{
timer = Time.deltaTime;
thisCube.transform.localScale += new Vector3(1, 0, 0) * timer * growFactor ;
thisCube.transform.localPosition += thisCube.transform.right * timer * growFactor * 0.5f;
yield return null;
}
}
}