使用滑块更改游戏对象的位置

时间:2019-05-16 21:31:26

标签: unity3d

我的游戏中有4个游戏对象,并且我想使用滑块更改这些对象的X和Y值。但是我不知道该怎么办。我需要帮助。

现在,我使用按钮使用下面的代码播放动画,但我想使用滑块更改游戏对象的位置。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playbut : MonoBehaviour {
public GameObject anim;
public GameObject anim1;
public GameObject anim2;
public GameObject scrool;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
public void OnClick(){
    anim.GetComponent<Animator> ().Play ("div");
    anim1.GetComponent<Animator> ().Play ("div1");
    StartCoroutine(WaitandPrint(2));
    anim2.GetComponent<Animator> ().Play ("div2");
}


private IEnumerator WaitandPrint(float waitTime)
{
    yield return new WaitForSeconds (waitTime);

    scrool.SetActive (true);
}

}

这就是我想要的:

所有游戏对象的位置都是X:-2.6:Y:-2.09,但是当我滑动滑块时,游戏对象的位置应该像这样:

游戏对象1 = X:2.5 Y:-0.03

游戏对象2 = X:-5.74 Y:0.09

游戏对象3 = X:-2.18 Y:2.48

游戏对象4 = X:-2.6 Y:-2.09

2 个答案:

答案 0 :(得分:1)

我建议使用屏幕空间画布,并创建一个新的Slider UI元素作为该画布的子元素。

如果您对如何执行操作感到困惑,请在线搜索Unity uGUI教程。

然后,您将要编写一个脚本来定义当Slider的值更改时要调用的方法。可以通过滑块上的检查器进行设置。

该脚本应该引用应该移动的游戏对象的“变换”,并且在更改“ Slider”值时调用的方法应更改“变换”的位置成员。

如果您对如何操作感到困惑,请在线搜索Unity脚本教程。

答案 1 :(得分:1)

根据您的需要,我看到了几种方法。

编辑:在您提供了其他详细信息之后,据我了解,所有游戏对象只有一个滑块。您要根据滑块的位置在两个点之间设置每个gameObject的位置。就像线性插值一样。

Lerp

如果是这样:

  1. 将以下脚本添加到所需的对象(一个空的gameObject /滑块)。
  2. Size属性设置为4以处理您的4个对象。它将创建一个包含4个条目的数组。
  3. 对于每个元素
    1. 拖放gameObject进入Transform字段
    2. 指定“开始位置”(PositionA),它是滑块值等于0时对象的位置
    3. 指定“结束位置”(PositionB),它是滑块值等于1时对象的位置
    4. 更改Points Color,以便“场景”视图中的小控件的颜色将使其更易于识别
  4. 确保滑块值从01,并且SetPositiononValueChanged事件的回调。
  5. 在滑块的On Value Changed事件中添加一个新条目(仅一个)。拖放包含脚本的gameObject,然后选择组件的SetPosition (dynamic float)功能
  6. 运行游戏,然后移动滑块以查看每个对象从其PositionAPositionB的情况。
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个滑条,则需要以下脚本,您可以将其附加到一个空的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;
    }
}

请编辑您的问题,并添加有关您问题的详细信息以获取足够的帮助。