在将组件添加到所有对象之前,如何设置刚体组件设置?

时间:2018-11-17 20:53:43

标签: c# unity3d

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

public class GenerateStairs : MonoBehaviour
{
    public GameObject stairsPrefab;
    public float delay = 3;
    public int stairsNumber = 5;
    public Vector3 stairsStartPosition;
    public Vector3 stairSize;
    public Vector3 stairsSize;
    public float stepWidthFactor = 1f;
    public MoveObjects moveobjects;
    public bool addRigidbody = false;

    private Vector3 stairsPosition;
    private GameObject stairsParent;

    // Use this for initialization
    void Start()
    {
        stairsParent = GameObject.Find("Stairs");
        StartCoroutine(BuildStairs());
    }

    // Update is called once per frame
    void Update()
    {

    }

    private IEnumerator BuildStairs()
    {
        for (int i = 1; i <= stairsNumber; i++)
        {

            stairsPosition = new Vector3(
                    stairsStartPosition.x,
                    stairsStartPosition.y + (i * stairsSize.y),
                    stairsStartPosition.z + (i * stairsSize.y) * stepWidthFactor);

            GameObject stairs = Instantiate(
                    stairsPrefab,
                    stairsPosition,
                    Quaternion.identity);

            if(addRigidbody)
            {
                stairs.AddComponent<Rigidbody>();
            }
            stairs.tag = "Stair";
            stairs.transform.parent = stairsParent.transform;
            stairs.transform.localScale = stairSize;

            yield return new WaitForSeconds(delay);
        }

        moveobjects.Init();
    }
}

在此处将刚体添加到每个楼梯之前:

stairs.AddComponent<Rigidbody>();

我希望首先在“开始”中使用质量变量等公共变量使用重力和其他刚体来设置刚体值设置,然后使用已经进行的设置向每个对象添加刚体。

否,如果我要向每个对象添加刚体,它将具有默认的刚体设置,我想在添加刚体之前控制此设置。

1 个答案:

答案 0 :(得分:1)

  

我要在添加刚体之前控制此设置。

不能,因为不能,不能将现有组件添加到GameObject。 AddComponent函数将组件的新实例添加到GameObject。

请注意,AddComponent函数会添加组件,然后返回它刚刚添加到GameObject的实例。您可以修改返回的实例组件,这就是您应该做的。

具有默认设置的刚体:

public Rigidbody deafultSettings;

将Rigidbody组件添加到楼梯GameObject,然后返回添加的组件:

Rigidbody stairRb = stairs.AddComponent<Rigidbody>();

您现在可以修改返回的组件或创建一个函数来简化您的操作:

CopyRigidBodySettings(deafultSettings, stairRb);

CopyRigidBodySettings函数:

void CopyRigidBodySettings(Rigidbody destination, Rigidbody source)
{
    destination.useGravity = source.useGravity;
    destination.mass = source.mass;
    destination.drag = source.drag;
    destination.angularDrag = source.angularDrag;
}

在添加组件后对其进行修改,而不是在添加之前进行修改。那应该不成问题,但如果您不喜欢那样,请使用预制件。实际上,这就是预制件的用途,因此您可以创建具有默认设置的GameObject,然后重新使用它们。用已经连接了Rigidbody的楼梯创建预制件,然后使用Instantiate函数将预制件恢复原状。在实例化预制件之前,可以在编辑器或脚本中对其进行修改。