Я вижу несколько способов сделать это, в зависимости от ваших потребностей.
РЕДАКТИРОВАТЬ: После того, как вы предоставили дополнительную информацию, я понимаю, что у вас есть только один слайдер для всех ваших игровых объектов.Вы хотите установить положение каждого игрового объекта между двумя точками в соответствии с положением ползунка.Как линейная интерполяция.

Если это так:
- Добавьте следующий скрипт к нужному объекту (пустой gameObject / слайдер).
- Установите для свойства
Size
значение 4
, чтобы обрабатывать ваши 4 объекта.Будет создан массив с 4 записями. - Для каждого элемента
- Перетащите объект gameObject для перемещения в поле
Transform
- Укажите «Начальную позицию» (
PositionA
), которая является позицией объекта, когда значение ползунка равно 0
- Укажите «конечную позицию» (
PositionB
), которая является позицией объекта, когда ползунокзначение равно 1
- Измените
Points Color
таким образом, чтобы цвет гизмо в представлении «Сцена» облегчал идентификацию
- Убедитесь, чтозначение слайдера колеблется от
0
до 1
, а SetPosition
является обратным вызовом события onValueChanged
. - Добавить новую запись в событие
On Value Changed
ползунка ( только один ).Перетащите элемент gameObject, удерживающий скрипт, и выберите функцию SetPosition (dynamic float)
компонента - Запустите игру и переместите ползунок, чтобы увидеть, как каждый объект переходит от их
PositionA
к PositionB
.
using UnityEngine;
[System.Serializable]
public struct TransformBetweenPoints // could not find an appropriate name....
{
[SerializeField]
private Vector3 positionA;
[SerializeField]
private Vector3 positionB;
[SerializeField]
private Transform transform;
public void SetPosition( float t )
{
if( transform != null )
transform.position = Vector3.Lerp( positionA, positionB, t );
}
#if UNITY_EDITOR
[SerializeField]
private Color pointsColor;
public void DrawGizmos()
{
Color gizmosColor = Gizmos.color;
if ( pointsColor.a <= Mathf.Epsilon ) pointsColor.a = 1;
if( transform != null )
{
Gizmos.color = Color.red;
Gizmos.DrawRay( transform.position, Vector3.right );
Gizmos.color = Color.green;
Gizmos.DrawRay( transform.position, Vector3.up );
Gizmos.color = Color.blue;
Gizmos.DrawRay( transform.position, Vector3.forward );
Gizmos.color = pointsColor;
Gizmos.DrawWireSphere( transform.position, 0.2f );
}
Gizmos.color = pointsColor;
Gizmos.DrawLine( positionA - Vector3.right, positionA + Vector3.right );
Gizmos.DrawLine( positionB - Vector3.right, positionB + Vector3.right );
Gizmos.DrawLine( positionA - Vector3.up, positionA + Vector3.up );
Gizmos.DrawLine( positionB - Vector3.up, positionB + Vector3.up );
Gizmos.DrawLine( positionA - Vector3.forward, positionA + Vector3.forward );
Gizmos.DrawLine( positionB - Vector3.forward, positionB + Vector3.forward );
Gizmos.color = gizmosColor;
}
#endif
}
public class PositionHandler : MonoBehaviour
{
[SerializeField]
private TransformBetweenPoints[] transforms;
public void SetPosition( float value )
{
for ( int i = 0 ; i < transforms.Length ; ++i )
transforms[i].SetPosition( value );
}
#if UNITY_EDITOR
public void OnDrawGizmosSelected()
{
for ( int i = 0 ; transforms != null && i < transforms.Length ; ++i )
transforms[i].DrawGizmos();
}
#endif
}
Если у вас есть 2 ползунка для каждого объекта (всего 8 ползунков для ваших 4 объектов), вы можете прикрепить следующий скрипт к каждому перемещаемому объекту и вызовите соответствующую функцию в onValueChanged
ползунка .Вам нужно будет изменить диапазон ползунка, чтобы переместить объект в соответствии с вашими потребностями.
using UnityEngine;
public class PositionHandler : MonoBehaviour
{
private Vector3 position;
public void SetPositionX( float value )
{
position = transform.position;
position.x = value ;
transform.position = position;
}
public void SetPositionY( float value )
{
position = transform.position;
position.y = value ;
transform.position = position;
}
}
Если у вас есть только 2 ползунка для всех ваших объектов, вам понадобится следующий скрипт, который вы можетеприкрепить к пустому объекту gameObject или панели, содержащей 2 ползунка + способ изменить свойство Target
(с помощью другого сценария или того же сценария, в зависимости от того, что вы хотите сделать).Опять же, вам нужно будет указать обратные вызовы SetPosition
в событиях onValueChange
.
using UnityEngine;
public class PositionSlider : MonoBehaviour
{
[SerializeField]
private Transform target;
private Vector3 position;
public Transform Target
{
get { return target ; }
set { target = value ; }
}
public void SetPositionX( float value )
{
if( Target == null )
{
Debug.LogError("The target is null, can't set its position!");
return;
}
position = Target.position;
position.x = value ;
Target.position = position;
}
public void SetPositionY( float value )
{
if( Target == null )
{
Debug.LogError("The target is null, can't set its position!");
return;
}
position = Target.position;
position.y = value ;
Target.position = position;
}
}
Пожалуйста, отредактируйте свой вопрос и добавьте сведения о своей проблеме для получения адекватной помощи.