[ad_1]
I’m at the moment creating a 2D sport in Unity, and I am having a problem with shifting cash to a selected place within the UI Canvas when they’re spawned. I would like the cash to animate from their spawn place within the sport world to a degree within the Canvas. Nonetheless, when the digicam strikes, the cash don’t accurately attain their vacation spot; they appear to go off-screen.
Right here is the context of my problem:
Setup:
I’ve a CoinManager
script that’s accountable for spawning cash and animating them to the UI Canvas.
The cash are instantiated at a place based mostly on the participant’s interactions, and I would like them to maneuver to a hard and fast place within the Canvas when collected.
The Code:
Right here is the related a part of my CoinManager
script:
public class CoinManager : MonoBehaviour
{
public static CoinManager occasion;
[SerializeField] personal GameObject coinPrefab;
[SerializeField] personal Remodel coinParent;
[SerializeField] personal RectTransform coinEndRectTransform; // The goal level within the Canvas
[SerializeField] personal int maxCoinAmount;
[SerializeField] personal float coinPerDelay;
[SerializeField] personal float moveDuration;
[SerializeField] personal float totalDelay;
[SerializeField] personal Ease moveEase;
personal void Awake()
{
occasion = this;
}
public void OnButtonPressed()
{
int coinAmount = Grave.Occasion.GetCurrentCoins();
coinAmount = Mathf.Min(coinAmount, maxCoinAmount);
coinPerDelay = totalDelay / coinAmount;
for (int i = 0; i < coinAmount; i++)
{
var targetDelay = i * coinPerDelay;
ShowCoin(targetDelay);
}
Invoke(nameof(OnAnimationDone), totalDelay + moveDuration);
}
public void OnAnimationDone()
{
Grave.Occasion.UpdateCoinText();
}
public void ShowCoin(float delay)
{
GameObject graveObject = GameObject.FindWithTag("Grave");
if (Grave.lastGraveWithCoins != null)
{
var coinObject = Instantiate(coinPrefab, coinParent);
var offset = new Vector3(Random.Vary(-.5f, .5f), Random.Vary(-.5f, .5f), 0f);
var startPos = Grave.lastGraveWithCoins.rework.place + offset;
coinObject.rework.place = startPos;
// Calculate the place in world house for the coinEndRectTransform
Vector3 worldPosition;
RectTransformUtility.ScreenPointToWorldPointInRectangle(
coinEndRectTransform,
coinEndRectTransform.place,
Digicam.principal,
out worldPosition
);
// Scale the coin earlier than shifting
coinObject.rework.localScale = new Vector3(.1f, .1f, .1f);
coinObject.rework.DOScale(Vector3.one, delay);
// Transfer the coin to the calculated world place
coinObject.rework.DOMove(worldPosition, moveDuration)
.SetEase(moveEase)
.SetDelay(delay)
.OnComplete(() =>
{
coinObject.SetActive(false);
});
}
}
}
Challenge:
The primary downside I’m dealing with is that when the digicam strikes, the cash don’t attain the designated place within the Canvas accurately. They often go off-screen or don’t transfer to the supposed level.
I want the cash to at all times animate towards the fastened place within the Canvas, whatever the digicam’s place or motion. I think that there could also be a problem with how the place is calculated or utilized, particularly when the digicam will not be stationary.
Further Info:
The coinEndRectTransform is ready up within the UI Canvas, and it ought to signify the goal place the place I would like the cash to go.
The sport is utilizing Cinemachine for digicam management, and I am undecided if this impacts the habits of the cash.
I might respect any insights or various strategies to make sure the cash at all times animate to the proper place within the Canvas, even when the digicam strikes.
[ad_2]