Как заменить текущий gameObject новым, сохранив при этом функциональность старого? - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь дать пользователю возможность изменить текущий gameObject (куб) на новую форму (сферу), однако я не могу понять, как перенести всю функциональность, которую я написал для куб к сфере.

Мне удалось уничтожить старый куб и заменить его на сферу, но ни одна из клавиш управления нажатием клавиши для куба, кажется, не присутствует для сферы. У меня была идея установить новые методы gameObject на те, которые я использовал для куба (то есть newSphere.transform.rotation () = this.transform.rotation ();), но, похоже, это не работает.

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

public class cubeControls : MonoBehaviour
{
    // Constants for object rotation
    public float moveSpeed = 80.0F;
    public float turnSpeed = 100.0F;

    // Initial scale of the original cube
    public static Vector3 initscale = Vector3.one;

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        /* Changing the position of the object
         * 
         */

        // Moving the object right
        if (Input.GetKey(KeyCode.D))
        {
            transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
        }

        // Moving the object left
        if (Input.GetKey(KeyCode.A))
        {
            transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
        }

        /* Changing the rotation of the object
        * 
        */

        // Rotating the cube to the right
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
        }

        // Rotating the cube to the left
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Rotate(Vector3.down, turnSpeed * Time.deltaTime);
        }

        // Saving the current rendered material
        Renderer rend = GetComponent<Renderer>();

        /* Changing the scale of the object
        * 
        */

        // Double the size of the cube
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            transform.localScale += new Vector3(2F, 2F, 2F);
        }

        /* Changing the color via key presses
         * 
         */

        if (Input.GetKeyDown(KeyCode.R))
        {
            rend.material.SetColor("_Color", Color.red);
        }

        // Changing to sphere
        if (Input.GetKeyDown(KeyCode.X))
        {
            GameObject newSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            Destroy(this.gameObject);
        }
    }
}

1 Ответ

0 голосов
/ 14 января 2019

Как правило, в Unity мы не создаем экземпляр примитива и не добавляем к нему компоненты вручную, что, как правило, не лучший способ сделать что-либо в долгосрочной перспективе, поскольку непрограммистам сложно изменить функциональность. Хуже того, требуется изменение кода, чтобы изменить то, как все работает! Главное преимущество Unity - это огромный полнофункциональный визуальный редактор, мы должны использовать его как можно чаще, иначе какой смысл вообще использовать Unity?

Вместо этого вы, вообще говоря, хотите создать префаб каждого из этих объектов, куба и сферы, и прикрепить скрипт к обоим. Затем, вместо того, чтобы создавать примитивную сферу и пытаться создать ее с нуля в скрипте, вы просто вызываете GameObject.Instantiate (), чтобы создать новую сферу тут же.

public class cubeControls : MonoBehaviour
{
    // Constants for object rotation
    public GAmeObject spherePrefab;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.X))
        {
            Instantiate(spherePrefab, transform.position, transform.rotation);
        }
    }
}

Это имеет несколько преимуществ: во-первых, у вас есть полный контроль над сферой внутри редактора, вы хотите прикрепить различные компоненты к вашей сфере? Вы можете сделать это без изменения кода! Хотите иметь немного другие параметры? Нет проблем. Хочет ли художник добавить крутой след в сферу? Они могут сделать это без помощи программиста.

Если вам нужно изменить переменные в сфере (например, чтобы передать, скажем, оставшиеся точки попадания куба?), Вы можете вызвать GetComponent () для только что созданного префаба сферы и вызывать функции / редактировать переменные по своему усмотрению.

...