Изменить положение игровых объектов с помощью ползунка - PullRequest
0 голосов
/ 17 мая 2019

В моей игре 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, но когда я передвигаю ползунок, положение игровых объектов должно быть таким:

Gameobject 1= X: 2,5 Y: -0,03

Gameobject 2 = X: -5,74 Y: 0,09

Gameobject 3 = X: -2,18 Y: 2,48

Gameobject 4 = X: -2,6 Y: -2,09

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Я вижу несколько способов сделать это, в зависимости от ваших потребностей.

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

Lerp

Если это так:

  1. Добавьте следующий скрипт к нужному объекту (пустой gameObject / слайдер).
  2. Установите для свойства Size значение 4, чтобы обрабатывать ваши 4 объекта.Будет создан массив с 4 записями.
  3. Для каждого элемента
    1. Перетащите объект gameObject для перемещения в поле Transform
    2. Укажите «Начальную позицию» (PositionA), которая является позицией объекта, когда значение ползунка равно 0
    3. Укажите «конечную позицию» (PositionB), которая является позицией объекта, когда ползунокзначение равно 1
    4. Измените Points Color таким образом, чтобы цвет гизмо в представлении «Сцена» облегчал идентификацию
  4. Убедитесь, чтозначение слайдера колеблется от 0 до 1, а SetPosition является обратным вызовом события onValueChanged.
  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 ползунка для каждого объекта (всего 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;
    }
}

Пожалуйста, отредактируйте свой вопрос и добавьте сведения о своей проблеме для получения адекватной помощи.

1 голос
/ 17 мая 2019

Я бы предложил использовать холст экранного пространства и создать новый элемент пользовательского интерфейса Slider в качестве дочернего элемента этого холста.

Если вы не уверены, как это сделать, поищите в Интернете учебник по Unity uGUI..

Затем вы захотите написать скрипт для определения метода, вызываемого при изменении значения Slider;это можно установить с помощью инспектора на ползунке.

Этот скрипт должен иметь ссылку на преобразование игрового объекта, который он должен перемещать, а метод, который он вызывает при изменении значения ползунка, должен изменить положениечлен Преобразования, чтобы сделать это.

Если вы не знаете, как это сделать, поищите в Интернете учебник по сценариям Unity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...