unity3d 如何在Unity中使用单个颜色选择器独立更改多个颜色对象?

bvhaajcl  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(183)

我面临一个接口问题,作为一个初学者,我不知道如何处理它。我将简要地解释一下。我有一个Brain对象,它的所有部分都是子对象(丘脑,动脉..),对于这些对象中的每一个,我都有一个显示/隐藏它的按钮和一个按钮(颜色),当按下该按钮时,将显示与其相连的色轮,以便用户可以选择更改给定对象的颜色(不是全部一起,而是独立的)。问题如下:如何使其在按下颜色按钮时显示色轮(其已经工作),但是其仅对特定对象(与颜色按钮相关的对象)起作用,而不必为N个对象创建N个不同的轮。
我做了一个脚本,它只能在一个对象上工作,但如果它被分配给不同的对象,就不能工作;创建一个BodyColorMat材质的矢量,就像这样

//render blue color
    public void BlueColor()
    {
        renderer.material = BodyColorMat[0];
        CurrMat = renderer.material;
    }

我应该改变方法吗?

fcg9iug3

fcg9iug31#

无论有多少对象,都可以使用网格渲染器阵列。

[SerializeField] private MeshRenderer[] meshRenderers;

public void SetColor(Color color)
{
    foreach (var meshRenderer in meshRenderers)
    {
        meshRenderer.material.color = color;
    }
}

测试示例

public Color _color;
private void OnValidate() => SetColor(_color);

nfzehxib

nfzehxib2#

这是一个纯粹的架构问题:您需要将功能委托给适当的类,并在它们之间建立通信:

  • 可着色对象应该能够激发OnSelect事件并将自身传递给它,
  • 选择管理器应该捕获此事件,并解构进入其接口的内容,并为您希望用于通信的每个重要接口触发一个事件
  • 色轮管理器订阅选择管理器的OnColorableSelected事件,在该事件中,色轮管理器将BrainPart设置为IColorable,并且能够设置其颜色。
interface IColorable {
  Color CurrentColor {get; set;}
}

class BrainPart : MonoBehaviour, IColorable {
  public Color CurrentColor {
      get => _currentColor;
      set => _currentColor = AssignColorTomaterialInstance(value);
  }

  // Fire this event when user selects this object, pass `this` to `Invoke()` method
  public UnityEvent<BrainPart> OnSelected; 
  // Here you change material instance color
  AssignColorToMaterialInstance(Color color) => ... 
}

class ColorWheelController : MonoBehaviour {
  void ShowColorWheel(IColorable colorable) => ...
}

class SelectionManager: MonoBehaviour {
  public UnityEvent<IColorable> OnColorableObjectSelected;
  void BrainPartSelected(BrainPart brainPart) {
      OnColorableObjectSelected.Invoke(brainPart);
  }
}

相关问题