Перемещение созданного игрового объекта

Я хочу изменить положение instantiated game object. Для этого я использовал UI button, когда пользователь нажимает на кнопку, куб будет instantiated, а когда пользователь нажимает на этот созданный куб и перемещает UI slider, положение этого куба будет изменено в соответствии со значением, заданным ползунком.

введите здесь описание изображения

Я пробовал этот способ, но он не работает. Что я делаю неправильно здесь

using UnityEngine;
using System.Collections;

public class instantiate : MonoBehaviour
{
    public GameObject cube;
    public float speed = 0f;
    public float pos = 0f;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, 100.0f))
            {
                Debug.Log("Clicked");

                if (hit.collider.tag == "Cube")
                {

                    // Destroy(hit.collider.gameObject);

                    // Destroy(this);
                    speed += Input.GetAxis("Horizontal");
                    hit.collider.gameObject.transform.eulerAngles = new Vector3(0, 0, speed);
                    hit.collider.gameObject.transform.position = new Vector3(0, 0, pos);//pos
                }
            }
        }

    }

    public void objinst()
    {
        Instantiate(cube, new Vector3(0, 0, 0), Quaternion.identity);
    }

    public void rotatess(float newspeed)
    {
        speed = newspeed;

    }

    public void positions(float newpos)
    {

        pos = newpos;
    }
}

person user3789211    schedule 26.08.2016    source источник
comment
По какой оси вы хотите перемещать объект при его скольжении?   -  person Programmer    schedule 26.08.2016
comment
@Программист по оси Z   -  person user3789211    schedule 26.08.2016


Ответы (2)


Предполагается, что у вас есть функция обратного вызова, которая вызывается при нажатии на Button, и другая, которая вызывается при изменении значения Slider. Я не могу сказать, делаете ли вы это из редактора, но по тому, как названы ваши функции, мы не можем сказать, какая из них вызывается во время Button клика или Slider изменения значения...

Поместите код Instantiate в функцию обратного вызова Button, затем поместите код перемещения куба в функцию обратного вызова Slider для изменения значения.

В коде Raycast, обнаруживающем щелчок по кубу, сохраните ссылку Transform куба на глобальную переменную Transform. Это сохраненное Transform — это то, что вы будете использовать для перемещения куба в вашей функции обратного вызова изменения значения Slider.

Вы подписываетесь на событие клика Button с помощью Button.onClick.AddListener(instantiateButtonCallBackFunction);, затем на событие изменения значения ползунка с помощью Slider.onValueChanged.AddListener(delegate { sliderCallBackFunction(cubeSlider.value); });

Вот как это должно выглядеть. Все делается с помощью кода. Просто перетащите префаб Cube, Slider и Button в нужный слот, и он должен работать. При нажатии на Button создается экземпляр Cube. При нажатии на куб вы сможете перемещать его с помощью ползунка.

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class instantiate : MonoBehaviour
{
    public GameObject cubePrefab;
    public Slider cubeSlider;
    public Button instantiateButton;

    public float speed = 0f;
    public float pos = 0f;


    private Transform currentObjectToDrag = null;

    // Use this for initialization
    void Start()
    {
        //Set Slider Values
        cubeSlider.minValue = 0f;
        cubeSlider.maxValue = 50f;
        cubeSlider.value = 0f;

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, 1000.0f))
            {
                GameObject objHit = hit.collider.gameObject;
                Debug.Log("We Clicked on : " + objHit.name);

                //Check if this is cube
                if (objHit.CompareTag("Cube"))
                {
                    Debug.Log("Cube selected. You can now drag the Cube with the Slider!");
                    //Change the current GameObject to drag
                    currentObjectToDrag = objHit.transform;
                }
            }
        }
    }

    public void instantiateCube()
    {
        //Instantiate(cubePrefab, new Vector3(0, 0, 0), Quaternion.identity);
        Instantiate(cubePrefab, new Vector3(-15.1281f, 0.67f, 7.978208f), Quaternion.identity);
    }

    public void rotatess(float newspeed)
    {
        speed = newspeed;

    }

    public void positions(float newpos)
    {
        pos = newpos;
    }

    //Called when Instantiate Button is clicked
    void instantiateButtonCallBack()
    {
        Debug.Log("Instantiate Button Clicked!");
        instantiateCube();
    }

    //Called when Slider value changes
    void sliderCallBack(float value)
    {
        Debug.Log("Slider Value Moved : " + value);

        //Move the Selected GameObject in the Z axis with value from Slider
        if (currentObjectToDrag != null)
        {
            currentObjectToDrag.position = new Vector3(0, 0, value);
            Debug.Log("Position changed!");
        }
    }

    //Subscribe to Button and Slider events
    void OnEnable()
    {
        instantiateButton.onClick.AddListener(instantiateButtonCallBack);
        cubeSlider.onValueChanged.AddListener(delegate { sliderCallBack(cubeSlider.value); });
    }

    //Un-Subscribe to Button and Slider events
    void OnDisable()
    {
        instantiateButton.onClick.RemoveListener(instantiateButtonCallBack);
        cubeSlider.onValueChanged.RemoveListener(delegate { sliderCallBack(cubeSlider.value); });
    }
}
person Programmer    schedule 26.08.2016
comment
Спасибо, я хорошо объяснил идею - person user3789211; 26.08.2016

Вам нужно сохранить ссылку на экземпляр, который вы создали.

GameObject myCube = Instantiate(cube, new Vector3(0, 0, 0), Quaternion.identity);

Затем вы можете управлять его положением, используя эту ссылку.

myCube.transform.position.x = 10;
person Soviut    schedule 26.08.2016