首页 > 解决方案 > 在将组件添加到所有对象之前,如何设置刚体组件设置?

问题描述

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>();

我想首先在开始时使用公共变量设置刚体值设置,如质量拖动使用重力和其他刚体的东西,然后将具有我所做设置的刚体添加到每个对象。

不,如果我将刚体添加到每个对象,它将使用默认刚体设置,我想在添加刚体之前控制此设置。

标签: c#unity3d

解决方案


我想在添加刚体之前控制这个设置。

你不能,因为你不能,因为你不能将现有组件添加到游戏对象。该AddComponent函数将组件的新实例添加到游戏对象。

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

保存默认设置的刚体:

public Rigidbody deafultSettings;

将刚体组件添加到您的楼梯游戏对象,然后返回添加的组件:

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;
}

组件在添加之后而不是在添加之前进行修改。这应该不是问题,但如果您不喜欢这样,请使用预制件。事实上,这就是预制件的用途,以便您可以使用默认设置创建游戏对象,然后重新使用它们。创建一个Rigidbody已经连接到楼梯的预制件,然后使用该Instantiate功能来安装预制件。您可以在实例化之前在编辑器或脚本中修改预制件。


推荐阅读