根据您的需要,我看到了几种方法。
编辑:在您提供其他详细信息之后,我的理解是您的所有游戏对象只有一个滑块。您想根据滑块的位置设置每个游戏对象在两点之间的位置。就像线性插值一样。
如果是这样:
- 将以下脚本添加到您想要的对象(一个空的游戏对象/滑块)。
- 将
Size 属性设置为4 以处理您的4 个对象。它将创建一个包含 4 个条目的数组。
- 对于每个元素
- 拖放游戏对象以移动到
Transform 字段
- 指定“起始位置”(
PositionA),即当滑块值等于0时对象的位置
- 指定“结束位置”(
PositionB),即当滑块值等于1时对象的位置
- 更改
Points Color 以便场景视图中的 Gizmo 颜色更易于识别
- 确保滑块值从
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 个滑块(4 个对象总共有 8 个滑块),那么,您可以将以下脚本附加到每个要移动的对象和 call the appropriate function in the onValueChanged of the slider。您必须根据需要更改滑块的范围以移动对象。
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 个滑块,您将需要以下脚本,您可以将其附加到一个空的游戏对象,或包含 2 个滑块的面板 + 一种更改 Target 属性的方法(通过另一个脚本,或相同的脚本,具体取决于您要执行的操作)。同样,您必须在 onValueChange 事件中指定 SetPosition 回调。
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;
}
}
请编辑您的问题并添加有关您的问题的详细信息以获得足够的帮助。