如何在保存旧游戏功能的同时将新游戏对象替换为新游戏对象?

时间:2019-01-13 16:41:33

标签: c# visual-studio unity3d transform gameobject

我正在尝试为用户提供将当前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 :(得分:0)

通常,在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(),并根据需要调用函数/编辑变量。 / p>