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

我知道如何访问另一个脚本的变量,但是我只能通过函数调用或委托来执行.第一个很简单,但是由于一旦我编辑了原始代码,代码就变得脆弱了,我必须再次编辑.
第二个比较好,但是由于我有很多函数,具有不同类型的返回值和参数,所以会使事情变得很复杂.
假设我想在游戏开始时做一些事情.到目前为止,我已经在适当的脚本中创建了一个名为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(或其他适当方法).

笔记:

上面的示例实际上只是一个示例,旨在向您提示如何思考,您还没有提供所有详细信息,即使您这样做了,我们也很难再为您提供帮助(只有随着时间的推移,您才能找到真正适合自己的方法您当前的问题).

在游戏项目中前进时,您会发现没有任何硬性规则可以遵循,显然模式很重要,但是您可能会发现自己最终拥有了自己的模式(即多种模式的细粒度组合使用).

也许“ 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.””也会给您一些启发.

结论是,发现/尝试模式,对其进行调整,随着时间的推移,您会发​​现最适合您的方法.

上一篇:[HNOI 2013]切糕


下一篇:minicom在虚拟机(linux)安装配置过程