【问题标题】:Change position of gameobjects with slider使用滑块更改游戏对象的位置
【发布时间】:2019-10-04 05:19:49
【问题描述】:

我的游戏中有 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

【问题讨论】:

  • 我不太清楚你在问什么。您是否需要知道如何设置一个完整的场景,或者您是否正在为特定的事情而苦恼?
  • 欢迎来到 StackOverflow!请添加更多详细信息并准确解释您要实现的目标。目前很难说出你实际上在问什么......
  • 您好,对于不清楚的问题,抱歉。我想用滑块制作动画。当我滑动滑块时,游戏对象应该在 X 和 Y 位置上改变位置。所以,我想学习如何用滑块移动游戏对象

标签: unity3d


【解决方案1】:

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

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

如果是这样:

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

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

【讨论】:

  • 你好。我只想使用 1 个滑块。有可能吗?
  • 总之,我想用一个滑块改变 4 个游戏对象的位置。例如;第一个游戏对象的位置是 X:-2 Y:-2.5 第二个对象的位置是 X:-5 Y:-3 但是当我滑动滑块时,第一个对象的位置应该是 X:-4 Y:-2,第二个的位置应该是 X:-6 Y:-4。这就是我需要做的事情
  • @BatuhanTaştekin 我已经编辑了我的答案,请告诉我我是否正确理解了您的问题,以及我添加的代码是否符合您的需求。
  • 我添加了空滑块,我已经有 4 个游戏对象。我应该附上哪个(滑块或游戏对象)这个脚本?
  • 正如我所指出的,脚本必须附加到场景中的空游戏对象或滑块本身。然后,您必须在检查器中填充 Transforms 数组并将 4 个对象拖放到适当的字段中 + 更改矢量位置。
【解决方案2】:

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

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

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

该脚本应该具有对它应该移动的游戏对象的 Transform 的引用,并且它在 Slider 值更改时调用的方法应该更改 Transform 的位置成员以执行此操作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2020-08-22
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多