using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChangePivotDirections : MonoBehaviour
{
public enum Directions { Left, Right, Up, Down, Both_Left_Right, Both_Up_Down };
public Directions direction;
public bool scaleBothDirections = false;
public Transform prefabToScale;
public float scalingamount;
public float scalingDuration;
public string directionState;
private Vector3 ToScale;
private bool isScaling = false;
private float setPivot;
private void Start()
{
ToScale = prefabToScale.transform.localScale;
if (scaleBothDirections == false)
{
ScalingDirections();
ToScaling();
}
else
{
ScalingDirections();
}
}
IEnumerator scaleOverTime(Transform objectToScale, Vector3 toScale, float duration)
{
//Make sure there is only one instance of this function running
if (isScaling)
{
yield break; ///exit if this is still running
}
isScaling = true;
float counter = 0;
//Get the current scale of the object to be moved
Vector3 startScaleSize = objectToScale.localScale;
while (counter < duration)
{
counter += Time.deltaTime;
objectToScale.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration);
yield return null;
}
isScaling = false;
}
private void ScalingDirections()
{
var child = prefabToScale.GetChild(0).transform;
if (scaleBothDirections == false)
{
if (direction == Directions.Left)
{
setPivot = prefabToScale.localScale.x / 2;
prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x + setPivot, prefabToScale.localPosition.y, prefabToScale.localPosition.z);
child.localPosition = new Vector3(child.localPosition.x - setPivot, child.localPosition.y, child.localPosition.z);
}
if (direction == Directions.Right)
{
setPivot = prefabToScale.localScale.x / 2;
prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x - setPivot, prefabToScale.localPosition.y, prefabToScale.localPosition.z);
child.localPosition = new Vector3(child.localPosition.x + setPivot, child.localPosition.y, child.localPosition.z);
}
if (direction == Directions.Up)
{
setPivot = prefabToScale.localScale.y / 2;
prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x, prefabToScale.localPosition.y - setPivot, prefabToScale.localPosition.z);
child.localPosition = new Vector3(child.localPosition.x, child.localPosition.y + setPivot, child.localPosition.z);
}
if (direction == Directions.Down)
{
setPivot = prefabToScale.localScale.y / 2;
prefabToScale.localPosition = new Vector3(prefabToScale.localPosition.x, prefabToScale.localPosition.y + setPivot, prefabToScale.localPosition.z);
child.localPosition = new Vector3(child.localPosition.x, child.localPosition.y - setPivot, child.localPosition.z);
}
}
else
{
if (direction == Directions.Both_Left_Right)
{
StartCoroutine(scaleOverTime(prefabToScale, new Vector3(ToScale.x + scalingamount, ToScale.y, ToScale.z), scalingDuration));
}
if (direction == Directions.Both_Up_Down)
{
StartCoroutine(scaleOverTime(prefabToScale, new Vector3(ToScale.x, ToScale.y + scalingamount, ToScale.z), scalingDuration));
}
}
directionState = direction.ToString();
}
private void ToScaling()
{
if (direction == Directions.Left || direction == Directions.Right)
{
StartCoroutine(scaleOverTime(prefabToScale, new Vector3(scalingamount, ToScale.y, ToScale.z), scalingDuration));
}
if (direction == Directions.Up || direction == Directions.Down)
{
StartCoroutine(scaleOverTime(prefabToScale, new Vector3(ToScale.x, scalingamount, ToScale.z), scalingDuration));
}
}
private void Update()
{
}
}
Например, если он масштабируется влево, а я изменяю его в середине вправо, то из точки масштабирования он теперь масштабируется вправо так же, как для повышения, так и для обоих состояний.
Конечно, вы не можете изменить Слева на Вверх в середине, поэтому в Обновлении он должен быть только с другой стороны от текущей. Например, измените слева направо или справа налево вниз и оба.
Все отлично работает при запуске игры, но не знаете, как внести изменения в обновлении.