C# 更改脚本的一个属性值,使其影响该脚本附加到的所有游戏对象

C# 更改脚本的一个属性值,使其影响该脚本附加到的所有游戏对象,c#,unity3d,C#,Unity3d,如何更改脚本的一个或两个属性值,以使其影响该脚本附加到的所有游戏对象 例如,使属性SphereSmall和SphereBig全局化 public Vector3 SphereSmall = new Vector3 (0.001f, 0.001f, 0.001f); public Vector3 SphereBig = new Vector3 (0.0015f, 0.0015f, 0.0015f); 两个gameObjects附加了此脚本,我在一个GameObject上更改了公共变量Sphe

如何更改脚本的一个或两个属性值,以使其影响该脚本附加到的所有游戏对象

例如,使属性SphereSmall和SphereBig全局化

 public Vector3 SphereSmall = new Vector3 (0.001f, 0.001f, 0.001f);
 public Vector3 SphereBig = new Vector3 (0.0015f, 0.0015f, 0.0015f);

两个gameObjects附加了此脚本,我在一个GameObject上更改了公共变量SpheresMail和SphereBig的属性。我希望在第二个GameObject中也更改此值。

您可以将[ExecuteInEditMode]添加到脚本中,使其在编辑器运行时运行。从那里,您可以检查值是否正在更改,然后更新它们。大概是这样的:

[ExecuteInEditMode]
public class MyScript : MonoBehaviour
{
  public int myValue;
  private int oldValue;

  void Update ()
  {
    if (oldValue != myValue)
    {
      MyScript[] objects = FindObjectsOfType<MyScript>();

      foreach(MyScript myObject in objects)
      {
        myObject.myValue = myValue
      }

      oldValue = myValue;
    }
  }
}
[ExecuteInEditMode]
公共类MyScript:monoBehavior
{
公共价值;
私人价值;
无效更新()
{
如果(oldValue!=myValue)
{
MyScript[]objects=FindObjectsOfType();
foreach(对象中的MyScript myObject)
{
myObject.myValue=myValue
}
oldValue=myValue;
}
}
}

但这不是最佳实践,因此我建议改为使用预制变体。

我也是unity的新手,但这里有一些解决方案:

1) 如果您讨论的是同一对象的多个实例,只需从该对象创建一个预置并更新预置的属性即可。

2) 如果您正在讨论不同对象的实例,可以尝试使用unity编辑器的多选功能,这将允许您编辑所有公共属性。如果您的“数字if”实例较少,并且在“层次结构”窗格中的父对象下分组,则此操作很容易

3) 如果您正在讨论不同对象的实例,并且不介意仅在运行时查看更新的效果:您可以尝试使用ScriptableObject类:

[CreateAssetMenu]
public class CommonObjectProperties : ScriptableObject
{
    public Vector3 SphereSmall = new Vector3(1, 0.001f, 0.001f);
    public Vector3 SphereBig = new Vector3(0.0015f, 0.0015f, 0.0015f);
}
创建此脚本后,转到“资源>创建>公用对象属性”:

现在,您可以使用此ScriptableObject实例将公共值添加到对象中,在ScriptableObject实例中更新公共值后,它们将跨所有对象更新

ObjectScript是放置在对象上的单行为脚本:

public class ObjectScript : MonoBehaviour
{
    public CommonObjectPropertis commonProps;
    public Vector3 ObjectScriptSmallSphere;

    private void Start()
    {
        ObjectScriptSmallSphere = commonProps.SphereSmall;   
    }
}
它在设计器中的外观:


我相信还有很多其他方法可以做到这一点,祝你好运

请提供更多信息,不清楚您想要什么。我已经编辑并发布了更多信息。您的目标是一次性实例化SphereSmall和SphereBig,并使它们可以从所有游戏对象访问,还是为运行该脚本的每个对象实例化它们,但参数相同?Mohammed,请提供更多的程序背景-对我来说,你的要求还不清楚。公平地说,你从来没有说过你需要在inspector中这样做,你只是说你需要改变它谢谢。我使用具有相同属性的不同脚本创建了一个游戏对象,并且附加到其他游戏对象的脚本引用了此不同脚本。这可能会导致问题,因为
MyScript
的所有实例都将运行此脚本。。。那么,在被任何其他实例重置之前,哪个实例将被允许更改其他实例?使用
ScriptableObject
或预置更合适。这个答案更合适!您仍然可以将
ScriptableObject
[ExecuteInEditMode]
组合,以便查看已处于编辑模式的效果