Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向游戏对象动态添加脚本并为其属性赋值_C#_Unity3d - Fatal编程技术网

C# 向游戏对象动态添加脚本并为其属性赋值

C# 向游戏对象动态添加脚本并为其属性赋值,c#,unity3d,C#,Unity3d,我想向游戏对象添加脚本/组件,并填充该脚本中的值。输入值来自父对象“LineManagerProperty”。在下面的示例中,我想将“LineManager”类添加到“Line”游戏对象,并在“LineManager”中指定属性。如果您查看'Line'类,我会添加'LineManagerProperty',以便它可以在unity inspector中显示为传递到'LineManager'的值。有更好的方法吗 公共类行:单一行为 { //这是添加到此处的,以便值可以显示在inspector中 /

我想向游戏对象添加脚本/组件,并填充该脚本中的值。输入值来自父对象“LineManagerProperty”。在下面的示例中,我想将“LineManager”类添加到“Line”游戏对象,并在“LineManager”中指定属性。如果您查看'Line'类,我会添加'LineManagerProperty',以便它可以在unity inspector中显示为传递到'LineManager'的值。有更好的方法吗

公共类行:单一行为
{
//这是添加到此处的,以便值可以显示在inspector中
//创建“LineManager”并将其添加到“Line”游戏对象时,这些值将传递到“LineManager”中
公共LineManager属性LineManager属性;
无效更新()
{
if(Input.GetMouseButtonDown(0))
{
//添加“LineManager”脚本并指定其属性
gameObject.AddComponent().LineManagerProperty=新的LineManagerProperty()
{
CollisionTag=LineManagerProperty.CollisionTag,
MaxTimeDuration=LineManagerProperty.MaxTimeDuration,
NumberOfHits=LineManager属性。NumberOfHits,
运行状况=LineManagerProperty.Health
};
}
}
}
公共类LineManager:MonoBehavior
{
公共LineManager属性LineManager属性;
//...
}
[可序列化]
公共类LineManager属性
{
公共字符串冲突标记;
公共浮动MaxTimeDuration;
公众浮点数;
}

在Unity中提供脚本的任何公共变量都将显示在inspector中,并且可以从任何位置进行设置。在您的情况下,将变量从
LineManagerProperty
移动到
LineManager
脚本中:

public class LineManager : MonoBehaviour
{
    public string CollisionTag;
    public float MaxTimeDuration;
    public float NumberOfHits;

    //...
}
然后要设置变量,只需使用GameObject

_line.CollisionTag = "";
_line.MaxTimeDuration = 0;
//.....

希望这有帮助

我不明白你想要什么,你想不想在inspector中看到LineManager,或者怎么样,但我会尽力帮助你。我猜您正在创建一些编辑器,不想将LineManager保存在预置中

也许它会给你一些想法,idk

#define EDIT_MODE // if you delete this, code in EDIT_MODE fields will ignored and never compiled
using UnityEngine;
public class Line : MonoBehaviour {
    public LineManagerProperty lineManagerProperty;
#if EDIT_MODE
    LineManager lineManager;
#endif
    void Start() {
#if EDIT_MODE
        lineManager = new LineManager(lineManagerProperty);
#endif
    }

    void Update() {
#if EDIT_MODE
        lineManager.Update();// if you want to call something
#endif
    }
}

public class LineManager  {
   public LineManager(LineManagerProperty lmp) {
       LineManagerProperty = lmp;
   }

   public LineManagerProperty LineManagerProperty;

   public void Update() { // if you want to call something
   }
}

我认为您正在寻找通过反射复制组件字段。Unity论坛有两个答案“LineManager”脚本需要动态添加,并且不能从检查器中编辑(因为它不会添加到那里)。如果我像你建议的那样将属性添加到“LineManager”,我将不得不为它创建一个预置,并通过预置分配值。很抱歉,我不清楚答案。将
LineManager
组件添加到游戏对象时,为了通过代码更改值,您需要获取对所添加组件的引用:
LineManager properties=GameObject.GetComponent()然后您可以通过执行
properties.CollisionTag=“”)来分配属性等。不需要通过检查器或预置来执行任何操作。因此我希望“LineManager”属性显示在“Line”对象的检查器中。问题是“LineManager”继承自“MonoBehavior”,这会阻止检查器显示属性。这就是为什么我必须创建一个单独的“LineManagerProperty”类,而不从“MonoBehavior”继承。因此,您可以尝试为脚本创建自定义检查器视图。idk。
#define EDIT_MODE // if you delete this, code in EDIT_MODE fields will ignored and never compiled
using UnityEngine;
public class Line : MonoBehaviour {
    public LineManagerProperty lineManagerProperty;
#if EDIT_MODE
    LineManager lineManager;
#endif
    void Start() {
#if EDIT_MODE
        lineManager = new LineManager(lineManagerProperty);
#endif
    }

    void Update() {
#if EDIT_MODE
        lineManager.Update();// if you want to call something
#endif
    }
}

public class LineManager  {
   public LineManager(LineManagerProperty lmp) {
       LineManagerProperty = lmp;
   }

   public LineManagerProperty LineManagerProperty;

   public void Update() { // if you want to call something
   }
}