我知道如何访问另一个脚本的变量,但是我只能通过函数调用或委托来执行.第一个很简单,但是由于一旦我编辑了原始代码,代码就变得脆弱了,我必须再次编辑.
第二个比较好,但是由于我有很多函数,具有不同类型的返回值和参数,所以会使事情变得很复杂.
假设我想在游戏开始时做一些事情.到目前为止,我已经在适当的脚本中创建了一个名为OnGameStart()的函数,并从那里调用了我需要的所有东西,并且OnGameStart()已公开,并从另一个脚本中进行了调用.
一开始,我将需要播放声音,检查保存的数据,播放UI和其他动画等,但是我不想让代码成为灾难.
我在网上寻找了此信息,但只找到了最简单的“如何在脚本之间进行通信”的内容,它与基本函数调用(有时是事件)一起使用.有人能为我提供一些资源来指导我如何制作紧凑的,隔离的类,以容纳Demeter’s law吗?
解决方法:
解决此类问题的方法绝对有很多,例如,您可以从Hollywood principle中获得一些启发.
而不是让您的播放器搜索某些内容,而是在初始化时提供给他.
这是一个非常简单的示例:
游戏管理器界面的定义:
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(或其他适当方法).
笔记:
上面的示例实际上只是一个示例,旨在向您提示如何思考,您还没有提供所有详细信息,即使您这样做了,我们也很难再为您提供帮助(只有随着时间的推移,您才能找到真正适合自己的方法您当前的问题).
在游戏项目中前进时,您会发现没有任何硬性规则可以遵循,显然模式很重要,但是您可能会发现自己最终拥有了自己的模式(即多种模式的细粒度组合使用).
结论是,发现/尝试模式,对其进行调整,随着时间的推移,您会发现最适合您的方法.