gpt4 book ai didi

c# - Unity - 访问其他脚本的变量 - 正确放置

转载 作者:行者123 更新时间:2023-11-30 15:59:05 24 4
gpt4 key购买 nike

我知道如何访问另一个脚本的变量,但我只能通过函数调用委托(delegate) 来完成。第一个很简单,但会使代码变得脆弱,因为一旦我编辑了原始代码,我就必须再次编辑。第二个更好,但因为我有很多函数,具有不同种类的返回值和参数,它会使事情复杂化很多。假设我想在游戏开始时做一些事情。到目前为止,我在适当的脚本中创建了一个名为 OnGameStart() 的函数,并从那里调用了我需要的所有内容,并且 OnGameStart() 已成为 public 并从另一个脚本调用。

一开始我需要播放声音、检查保存数据、播放 UI 和其他动画等等,但我不想让我的代码成为一场灾难。我在网上找过这个,但只找到了最简单的“如何在脚本之间进行通信”的东西,它伴随着基本的函数调用,有时是事件。有经验的人可以指导我找到有关如何制作紧凑、隔离的类的资源吗? Demeter's law ?

最佳答案

解决此类问题肯定有很多可能性,例如,您可以从 Hollywood principle 中获得一些灵感。 .

不要让您的 Player 搜索某些东西,而是在初始化时将其提供给他。

这是一个非常简单的示例:

游戏管理器接口(interface)的定义:

using UnityEngine;

namespace Assets.Scripts
{
public interface IGameManager
{
void PlayAudioClip(AudioClip audioClip);
}
}

游戏管理者的定义:

using UnityEngine;

namespace Assets.Scripts
{
public class GameManager : MonoBehaviour, IGameManager
{
#region IGameManager Members

public void PlayAudioClip(AudioClip audioClip)
{
// TODO
}

#endregion
}
}

一个例子:

using System;
using UnityEngine;

namespace Assets.Scripts
{
public class Player : MonoBehaviour
{
public GameManager GameManager; // TODO assign this in Inspector

public void Start()
{
if (GameManager == null)
throw new InvalidOperationException("TODO");
}

public void Update()
{
// demo
var wounded = true;
var woundedAudioClip = new AudioClip();
if (wounded)
{
GameManager.PlayAudioClip(woundedAudioClip);
}
}
}
}

您还可以在 Unity 中使用某种Singleton(或任何合适的)。

注意事项:

上面的例子实际上只是一个提示你如何思考的例子,你没有提供所有的细节,即使你提供了,我们也很难帮助你(只有你会随着时间的推移找到真正适合你当前问题的方法。

在推进您的游戏项目时,您会发现没有硬性规则可循,显然模式很重要,但您可能会发现自己最终会得到自己的(即多种模式的细粒度组合使用)。

也许' Who wrote this programing saying? "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." ' 也会给你一些启发。

结论是,发现/尝试模式,调整它们,随着时间的推移,您会发​​现最适合您的模式。

关于c# - Unity - 访问其他脚本的变量 - 正确放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42099487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com