精华内容
下载资源
问答
  • 我们开服的时候,经常会碰到玩家反应,传奇里怎么不能删除人物,或者有些玩家号被盗了也会来问GM,为什么这个游戏还可以删除人物,我们经常会被玩家的思想所左右,今天给大家讲解一下我们哪里设置允许/禁卡删除...

    我们在开服的时候,经常会碰到玩家反应,传奇里怎么不能删除人物,或者有些玩家号被盗了也会来问GM,为什么这个游戏还可以删除人物,我们经常会被玩家的思想所左右,今天给大家讲解一下我们在哪里设置允许/禁卡删除角色,自己的游戏自己做主。

    首先我们打开服务端所在目录,Mirserver\DBServer 文件夹下面的DBServer.exe,所有引擎都是通过设置DBServer.exe进行设置的,只是位置有点小异,我这里讲的是Gom引擎为例

    打开DBServer.exe之后,点【选项】---【参数设置】,然后有一个基本参数设置,允许客户端删除》大于多少级的角色,这里我们勾选设置,比如我只要他删除20级以下的,那么我们就填20,如果你要他能删除100级以下的人物角色,那么你就填100,根据自己的要求进行设置

    展开全文
  • 游戏设置

    2020-11-26 18:34:10
    服务器保存配置的好处就是每次都能读取到玩家的设置信息,即使玩家删除游戏后再下载。 客户端实现的话假如是cocos2d,主要是使用UserDefault类来做的,它会把配置信息保存到一个xml配置文件。 参考资料: ...

    游戏里面常常会有一些设置,比如设置是否可以被观察装备,设置一些操作习惯等等。这种设置可以在服务端实现,也可以在客户端实现。服务器实现就是客户端上每次选择一种设置后就给服务器发消息,服务器收到设置信息后保存一下即可。服务器保存配置的好处就是每次都能读取到玩家的设置信息,即使玩家删除掉游戏后再下载。

    客户端实现的话假如是cocos2d,主要是使用UserDefault类来做的,它会把配置信息保存到一个本地的xml配置文件中。

    参考资料:

    https://blog.csdn.net/qq_37233607/article/details/80012311

    展开全文
  • 文章开始前,我们有必要区分一下使用Destroy和DestroyImmediate删除游戏物体有什么区别? 1 使用Destroy删除游戏物体,游戏物体并不会立即被删除,而是异步执行的,不会影响主线程的执行,说白了,就是...

    以前使用Destroy删除游戏物体,删了就删了,也没有使用过DestroyImmediate来删除游戏物体

    今天使用Destroy却碰到了一个坑,故顺便记录一下

     

    在文章开始前,我们有必要区分一下使用Destroy和DestroyImmediate删除游戏物体有什么区别?

    1   使用Destroy删除游戏物体,游戏物体并不会立即被删除,而是异步执行的,不会影响主线程的执行,说白了,就是它另外开一条道去执行了,这点很重要,接下来的例子就会有体现

    2  使用DestroyImmediate删除游戏物体,游戏物体立即被删除,代码顺序执行,影响主线程的执行

     

     

    首先先介绍一下问题的背景

    我做的是一个习题系统,包括选择题、填空题和简答题,填空题的界面如下图:

    为了方便描述,请允许我把

    这一块东西叫做 ‘框’,如上面的叫  ‘框1’

    使用AnswerPanel1为模板,生成填空题的  ‘空2’(‘框2’)、‘空3’('框3')、‘空4’('框4)等,为了程序方便操作,名称对应为AnswerPanel2、AnswerPanel3 、AnswerPanel4 等  。 因为需要填空的个数是不确定的,需要根据每道题的问题中需要填空的个数来动态生成  ‘框’

    以点击  ‘上一题’的按钮为例进行说明,当用户点击该按钮时,保存用户输入的答案,并把这道题中的所有的  ‘框’(除了'框1')都进行删除,接着在这个界面加载上一道题的题目,并根据题目中空的个数来动态绘制 ‘框’的个数,最后,还需要把用户在这道题填了那些内容加载回来并显示回对应的 ‘框’。

    总的业务逻辑描述如下图:

     

    执行第一步时,使用Destroy删除 ‘框’时,发现一个很奇怪的问题,第三步动态绘制的 ‘框’的个数是正确的,但是到第四步时,显示回用户的答案时总是不正确(只有'框1'显示的答案正确,其它的‘框’需要显示的答案直接不显示)

    出现这种情况的原因是: 使用Destroy删除时,是异步删除(它是另外开道执行删除),如本道题的 ‘框3’还没有删除,上一道题的 ‘框3’就已经绘制完毕,而且两个 ‘框3’是同名的,有两个同名的 ‘框3’,当执行到第四步时,通过GameObject.Find('框3名称')的方式找到 ‘框3’,这时找到的是本道题的  ‘框3’,并把用户对应的答案显示回找的的 ‘框3’,当本道题的 ‘框3’删除了,留下的是你所看到的上一道题的  ‘框3’(空的,本来该有的,却变成啥也没有)

     

    解决办法,就行删除时,不让它另外开道进行删除,说白了,就是第一步就彻底删完,不删除就不执行第二步,这时DestroyImmediate就派上用场了,把使用Destroy的地方替换为DestroyImmediate

     

    本以为一切都结束时,又踩了一个不该踩的坑。

    我使用的方法是: 找到  ‘框’的父游戏物体,是上面第一张图 中的  AnswerPanel,然后删除AnswerPanel下的所有子物体(除了 '框1'),代码如下:

    private RectTransform  _AnswerPanelTransform;
    
     _AnswerPanelTransform = GameObject.Find("AnswerPanel").GetComponent<RectTransform>();
    
            //每次绘制前,都把上一次绘制的删除
            for (int childIndex =0; childIndex< _AnswerPanelTransform.childCount; childIndex++)
            {
                if (_AnswerPanelTransform.GetChild(childIndex).gameObject.name != "AnswerPanel1")
                {
                    GameObject.DestroyImmediate(_AnswerPanelTransform.GetChild(childIndex).gameObject);
                }
               
            }

    不知你有没有发现问题所在,是真的能够全部删除(除了'框1')吗?答案是非也,AnswerPanel每删除一个子物体,它的childCount值就减少1,就好像是你要删除一个List中的一个元素一样,当List中有10个对象的时候,如果RemoveAt掉了第0个,那么后面的9个对象都会向前移动。

     

    解决办法是:设置childIndex的初始值为:_AnswerPanelTransform.childCount-1,代码如下:

     private RectTransform  _AnswerPanelTransform;
    
     _AnswerPanelTransform = GameObject.Find("AnswerPanel").GetComponent<RectTransform>();
    
            //每次绘制前,都把上一次绘制的删除
            for (int childIndex = _AnswerPanelTransform.childCount-1; childIndex >=0; childIndex--)
            {
                if (_AnswerPanelTransform.GetChild(childIndex).gameObject.name != "AnswerPanel1")
                {
                    GameObject.DestroyImmediate(_AnswerPanelTransform.GetChild(childIndex).gameObject);
                }
               
            }

     

    好了,到此,结束完毕

     

    展开全文
  • Unity 保存和载入游戏

    万次阅读 多人点赞 2017-11-27 11:31:17
    原文:How to Save and Load a Game in Unity 作者:Anthony Uccello 译者:kmyhy 游戏现在变得越来越长,有些游戏已经超过了 100 个小时的内容。不可能让玩家一次就玩完整...你必须存档保存玩家的设置吗?以及

    原文:How to Save and Load a Game in Unity
    作者:Anthony Uccello
    译者:kmyhy

    游戏现在变得越来越长,有些游戏已经超过了 100 个小时的内容。不可能让玩家一次就玩完整个游戏。允许玩家保存游戏是游戏最基本的一个功能——哪怕仅仅保存玩家的得分记录。

    但如何创建一个存档文件,以及需要在里面保存什么东西?你必须在存档中保存玩家的设置吗?以及如何将存档保存到 web 上允许玩家在不同设备上下载呢?

    在这篇教程中,你将学习:

    • 什么是是序列化以及反序列化。
    • 什么是 PlayerPrefs 以及如何用它保存玩家设定。
    • 如何创建游戏存档并将它保存到磁盘。
    • 如何加载游戏存档。
    • 什么是 JSON 以及如何使用它。

    假定你具备简单的 Unity 使用知识(比如创建和打开脚本),但不需要什么东西都懂,本教程很容易上手的。哪怕你是一个 C# 新手,你也能上手,只不过有几个概念你需要进一步的阅读而已。

    注意:如果你没有接触过 Unity 或者想了解更多的 Unity 技巧,你可以参考我们的其它 Unity 教程,其中你可以学到大量 Unity 主题,从 C# 到如何编写 UI。

    开始

    这里下载开始项目。你将实现保存游戏和加载的代码,以及保存玩家设定的逻辑。

    主要的存档概念

    在 Unity 中关于保存,有 4 个关键的概念:

    • PlayerPrefs: 这是一个特殊的缓存系统,在两次游戏过程中为玩家保存简单设定。许多新手程序员误以为他们能够用它来保存游戏存档,但这不是什么好的做法。它只允许你保存简单的东西,比如图形声音设置、登录信息或者其它基本的用户相关的数据。
    • 序列化:这是 Unity 真正用到的关键点。序列化将对象转换成字节流。听起来有点抽象,你可以看看这张图:

      SerializationIllustration.png

      什么是“对象”?在这里“对象”是 Unity 中的任意脚本或文件。事实上,当你创建一个 MonoBehaviour 脚本时,Unity 会通过序列化/反序列化将文件转换成 C++ 代码,然后变成你在检查器窗口中看见的 C# 代码。如果你曾经添加过 [SerializeField] 让某些东西在检查器中显示出来,你就知道怎么回事了。

    注意:如果你是一个 Java 或者 web 开发者,你可能熟悉 marshalling (编码解码)的概念。序列化和 marshalling 是几乎是同义词,如果你硬要说它们有什么不同,序列化是将对象从一种对象转换成另一种形式(比如,对象->字节),而 marshalling 是让参数从一个地方传到另一个地方。

    • 反序列化:就是它的名字所暗示的。它是序列化反面,将一个字节流转换成对象。
    • JSON:全称是 JavaScript Object Notation,是一种语言无关的发送和接收数据的常用格式。例如,你可能有一个运行在 Java 或者 PHP 下面的 web 服务器。你不能发送 C# 对象给它,但你可以发送这个对象的 JSON 形式给它,服务器会用它来重新创建一个本地版本的对象。后面的内容中你会学习更多关于这方面的内容,现在你只需要理解它是一种简单的格式化数据让它能够跨平台的方法(就像 XML)。当进行“对象->JSON”和“JSON->对象”转换时,可以分别将这两种称作称作 JSON 序列化和JSON 反序列化。

    Player Prefs

    我们创建了一个项目,以便你能将注意力集中在保存、加载游戏的逻辑上。但是,如果你想了解它是怎样运作的,不妨打开所有脚本,看看都是怎样实现的,如果需要帮助尽可到论坛中进行提问。

    打开项目,打开名为 Game 的场景,点击 play。

    1-650x263.png

    要开始游戏,点击 New Game 按钮。玩游戏时,直接用鼠标进行移动,枪会自动跟随你的动作。点击鼠标左键开火,打中目标一次(它会以不同的时间间隔上下翻转)就会计分。试玩一下,看看在 30 秒内能拿到多少分。按 esc 键可以弹出这个菜单。

    2-650x263.png

    同这个游戏一样搞笑的是,它没有音乐,显得有点枯燥。你可能看到了有一个 music 开关,但它是关着的。点击 play 启动游戏,这次点击 Music 开关将它设置为 On,你会在开始游戏后听到音乐。确保你的扬声器已打开!

    7.png

    修改音乐设定很简单,但在此点击 play 按钮会出现一个问题:音乐开关又关闭了。在修改音乐设定时,没有保存这种修改。这就是 PlayerPrefs 负责的事情。

    在 Scripts 文件夹中新建脚本 PlayerSettings。因为需要用到某些 UI 元素,在文件头部引用其他命名空间:

    using UnityEngine.UI;
    

    然后,新建几个变量:

    [SerializeField]
    private Toggle toggle;
    [SerializeField]
    private AudioSource myAudio;

    这些变量用于保存开关和 AudioSource 对象。

    然后新建一个函数:

      public void Awake ()
      {
        // 1
        if (!PlayerPrefs.HasKey("music"))
        {
          PlayerPrefs.SetInt("music", 1);
          toggle.isOn = true;
          myAudio.enabled = true;
          PlayerPrefs.Save ();
        }
        // 2
        else
        {
          if (PlayerPrefs.GetInt ("music") == 0)
          {
            myAudio.enabled = false;
            toggle.isOn = false;
          }
          else
          {
            myAudio.enabled = true;
            toggle.isOn = true;
          }
        }
      }

    在初始化时,这将:

    1. 判断 PlayerPrefs 是否有一个缓存了的 key 为 music 的值存在。如果没有,新建一个键值对,用 music 作为键,1 作为值。同时将开关设置为 on,并打开 AudioSource。这应当是玩家第一次运行游戏。值为 1 是因为不允许保存 Boolean 值(但你可以用 0 表示 false,1 表示 true)。
    2. 检查 PlayerPrefs 中的 music 键。如果它的值为 1,玩家的声音是打开的,因此打开音乐,设置开关为 On。否则,将音乐关闭,开关也 Off。

    保存脚本,返回 Unity。

    将 PlayerSettings 脚本附加到 Game 游戏对象。然后展开 UI 游戏对象下面的 Menu,显示它的子对象。然后将 Music 游戏对象拖到 PlayerSettings 脚本的 Toggle 字段。然后,选择 Game 游戏对象,将 AudioSource 拖到 MyAudio 字段。

    playersettings.png

    当游戏运行时,音乐响了(因为 Awake 函数中的代码),但你仍然需要添加玩家在游戏过程中改变对设置进行改变的代码。打开 PlayerSettings 脚本,添加函数:

      public void ToggleMusic()
      {
        if (toggle.isOn)
        {
          PlayerPrefs.SetInt ("music", 1);
          myAudio.enabled = true;
        }
        else
        {
          PlayerPrefs.SetInt ("music", 0);
          myAudio.enabled = false;
        }
        PlayerPrefs.Save ();
      }
    

    这里做的和上一段代码基本一样,除了一个关键的地方。这里它检查了音乐开关的状态,并根据情况修改和保存设置。为了让这个方法能够被调用和派上用场,你必须设置 Toggle 游戏对象的回调方法。选中 Music 游戏对象,将 Game 游戏对象拖到 OnValueChanged 节的 Object 一栏:

    toggle.png

    在下拉框中当前值为 No Functions,修改为 PlayerSettings -> ToggleMusic()。当菜单中的开关按钮被点击,它会调用 ToggleMusic 函数。

    toggleSet.png

    现在你已经用某些东西去记录音乐设定了。点击 play,试着打开/关闭 music 开关,结束游戏并重新启动游戏。

    音乐设置现在已经能保存了!干得不错——但你只是用到了序列化的皮毛而已。

    保存游戏

    PlayerPrefs 的用法很简单吧?通过它,你能够简单保存某些设置如玩家的图形设置、登录信息(比如 Facebook 或者 Twitter 的 token),以及需要保存的玩家其它设置。但是,PlayerPrefs 不是为了游戏存档而设计的。因此,你需要用到序列化。

    创建一个游戏存档文件的第一步是创建一个存档文件类。新建一个 Save 脚本,取消 MonoBehaviour 继承。删掉默认的 Start() 方法和 Update() 方法。

    添加下列变量:

    public List<int> livingTargetPositions = new List<int>();
    public List<int> livingTargetsTypes = new List<int>();
    
    public int hits = 0;
    public int shots = 0;

    为了保存游戏,你必须记录还活着的机器人在什么位置以及它们的种类。这要用到两个 List。hits 和 shots 则用 int 来保存。

    还需要添加一句非常重要的代码。在类声明之上,添加:

    [System.Serializable]
    

    这是一个属性,它标明了代码的一个元数据。它告诉 Unity 这个类可以被序列化,这意味着你可以将它转换成字节流并保存到磁盘文件中。

    注意:属性的使用非常广泛,它允许你在类、方法和变量上附加数据(这种数据叫做元数据)。甚至你可以定义自己的元数据并用于你的代码。序列化中使用了 [SerializeField] 和 [System.Serializable] 属性,这样在序列化对象时它知道要写入什么。其它属性还包括用于单元测试和依赖注入的设置,则不再本文范围之内,但你也可以研究一番。

    完整的 Save 脚本应该是这样子:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [System.Serializable]
    public class Save
    {
      public List<int> livingTargetPositions = new List<int>();
      public List<int> livingTargetsTypes = new List<int>();
    
      public int hits = 0;
      public int shots = 0;
    }

    然后,打开 Game 脚本,添加一个方法:

    private Save CreateSaveGameObject()
    {
      Save save = new Save();
      int i = 0;
      foreach (GameObject targetGameObject in targets)
      {
        Target target = targetGameObject.GetComponent<Target>();
        if (target.activeRobot != null)
        {
          save.livingTargetPositions.Add(target.position);
          save.livingTargetsTypes.Add((int)target.activeRobot.GetComponent<Robot>().type);
          i++;
        }
      }
    
      save.hits = hits;
      save.shots = shots;
    
      return save;
    }

    这段代码创建了一个 Save 类实例,根据存活的机器人来进行赋值。同时还保存了玩家的 shots 和 hits。

    保存按钮已经链接到 Game 脚本的 SaveGame 方法,但里面没代码。将 SaveGame 函数修改为:

    
    public void SaveGame()
    {
      // 1
      Save save = CreateSaveGameObject();
    
      // 2
      BinaryFormatter bf = new BinaryFormatter();
      FileStream file = File.Create(Application.persistentDataPath + "/gamesave.save");
      bf.Serialize(file, save);
      file.Close();
    
      // 3
      hits = 0;
      shots = 0;
      shotsText.text = "Shots: " + shots;
      hitsText.text = "Hits: " + hits;
    
      ClearRobots();
      ClearBullets();
      Debug.Log("Game Saved");
    }

    代码解释如下:

    1. 创建了一个 Save 对象,同时当前游戏的所有数据都会保存到这个对象中。
    2. 创建了一个 BinaryFormatter,然后创建一个 FileStream,在创建时指定文件路径和要保存的 Save 对象。它会序列化数据(转换成字节),然后写磁盘,关闭 FileStream。现在在电脑上会多一个名为 gamesave.save 的文件。.save 后缀只是一个示例,你可以使用任意扩展名。
    3. 重置游戏,以便玩家保存后所有东西都处于默认状态。

    要保存游戏,在玩的过程中按下 esc 键,然后点击 Save 按钮。你会注意到所有东西都被重置了,控制台会显示一条消息,说游戏已经被保存。

    4.png

    在 Game 脚本中 LoadGame 方法已经连接到 Load 按钮了。打开 Game 脚本,找到 LoadGame 函数。将它修改为:

    public void LoadGame()
    { 
      // 1
      if (File.Exists(Application.persistentDataPath + "/gamesave.save"))
      {
        ClearBullets();
        ClearRobots();
        RefreshRobots();
    
        // 2
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/gamesave.save", FileMode.Open);
        Save save = (Save)bf.Deserialize(file);
        file.Close();
    
        // 3
        for (int i = 0; i < save.livingTargetPositions.Count; i++)
        {
          int position = save.livingTargetPositions[i];
          Target target = targets[position].GetComponent<Target>();
          target.ActivateRobot((RobotTypes)save.livingTargetsTypes[i]);
          target.GetComponent<Target>().ResetDeathTimer();
        }
    
        // 4
        shotsText.text = "Shots: " + save.shots;
        hitsText.text = "Hits: " + save.hits;
        shots = save.shots;
        hits = save.hits;
    
        Debug.Log("Game Loaded");
    
        Unpause();
      }
      else
      {
        Debug.Log("No game saved!");
      }
    }

    细细过一遍:

    1. 判断存档文件是否存在。如果存在,它会清空机器人和分数。否则,打印控制台“没有存档文件”。
    2. 和保存文件时类似,又创建了一个 FileStream,只不过和写入不同,这次是让它读取字节流。因此直接传入存档文件的路径。然后生成一个 Save 对象并关闭 FileStream。
    3. 尽管你已经拥有了存档信息,你仍然需要将它转换成游戏状态。这个循环遍历了保存的机器人位置(或者的机器人),天后在那个位置添加一个机器人。并正确设置机器人的种类。为了简单起见,定时器被重置,但如果你愿意的话也可以删除这句。这防止机器人立马消失,让玩家有几秒钟的时间反应。同时,为了简单起见,机器人的上移动画被设置为已结束,这样当你存档时机器人只上移了一部分,但在加载游戏之后却显示了完全上移。
    4. 刷新 UI 上的 hits 和 shotsp,同时也设置了本地变量,这样当玩家开火或者击中目标时会继续从原来的分数值叠加。如果你不做这个步骤,当玩家下次开火或者击中目标时值会显示为 1。

    点击 play,玩一小会游戏并存档。点击 Load 按你会看到它会将你保存游戏时的敌人都加载进来。它还会正确地设置你的积分和射击次数。

    5-650x249.png

    将数据保存为 JSON

    在保存数据时有一个技巧——那就是 JSON。你可以创建一个本地 JSON 对象用于代表你的游戏存档,将它发送给服务器,然后将这个 JSON(字符串)下载到另一台设备,将它从字符串转换回 JSON。本教程不会介绍如何向服务器发送接收数据,而是想介绍 JSON 的使用以及它是如何的简单。

    JSON 格式和你在 C# 代码中的对象稍有不同,但它也很简单。这是一个简单 JSON:

    {
      "message":"hi",
      "age":22
      "items":
      [
        "Broadsword",
        "Bow"
      ]
    }

    外边的大括号表示了父对象,即这个 JSON。如果你了解字典的数据结构,那么 JSON 就跟它一样。一个 JSON 文件就是对键值对进行的一个映射。因此在上面的示例中,有 3 个键值对。在 JSON 中,键总是字符串,当值可以是对象(比如子 JSON 对象)、数组、数字或者字符串。message 键中存储的值是 hi,age 键中的值是数字 22,items 键的值是一个带两个字符串的数组。

    JSON 对象自身是以字符串类型存储的。通过将数组转换成字符串,任何语言都能简单地以一个字符串作为构造参数重建 JSON 对象。很方便,也很简单。

    每种语言都有自己的从这种格式创建对象的方法。从 Unity 5.3 开始,就有一个原生方法,可以用一个 JSON 字符串创建 JSON 对象。你可以创建一个 JSON 对象用于保存玩家的得分记录并打印到控制台。但你可以将这个逻辑扩展到发送 JSON 到服务器。

    在 Game 脚本中有一个 SaveAsJSON 方法,它已经连接到 Save As JSON 按钮。修改这个 SaveAsJSON 方法为:

    public void SaveAsJSON()
    {
      Save save = CreateSaveGameObject();
      string json = JsonUtility.ToJson(save);
    
      Debug.Log("Saving as JSON: " + json);
    }

    这里和前面一样创建了一个 Save 对象。然后用 JsonUtility 类的 ToJSON 方法创建了一个 JSON 字串。然后打印到控制台。

    开始游戏,打死几个敌人,按下 esc 键打开菜单。点击 Save As JSON 按钮,你会看到你创建的 JSON 字符串:

    6.png

    如果你想将这个 JSON 转换成一个 Save 对象,你可以这样:

    Save save = JsonUtility.FromJson<Save>(json);
    

    如果你想从 web 下载一个存档然并加载到你的游戏中,这就是你要做的工作。但创建一个 web 服务器是另外一个课程了!现在,给自己一个奖励,因为你刚刚学完了几个技术,在你下一个游戏(叹气)中会省心不少!

    接下来做什么?

    你可以从这里下载最后的项目文件。

    现在你拥有了一个创建好游戏的强大工具,通过神奇的序列化让你的玩家能够保存和加载游戏。你也学习了什么是 JSON 以及如何用它进行云存储。你还学习了什么是 PlayerPrefs 它能用来干什么(设定!),以及它不能用来干什么(保存游戏)。

    如果你想学习更多 Unity 内容,我们有一个完整的Unity 教程,欢迎你进入我们的 Unity 论坛。想说点什么,尽管留言。

    如果你是 Unity 的铁粉,想成为一个彻头彻尾的开发者,请阅读我们的Unity Games by Tutorials,其中会教你从头制作 4 个完整游戏。其中有一章介绍了如何用 JSON 加载游戏关卡。

    有任何问题或评论,请在下面留言!

    展开全文
  • 如何从Steam库隐藏或删除游戏

    千次阅读 2020-09-21 09:49:32
    (How to Hide a Steam Game) To hide a Steam game, locate it in your library, right-click it, and then click “Set Categories.” 要隐藏Steam游戏,请您的媒体库找到它,右键单击它,然后单击“设置类别”...
  • 修改虚拟机设置游戏检测

    万次阅读 2017-07-25 22:52:48
    一: 首先我们要找到当前需要玩游戏的虚拟机系统的存放目录!..."桌面" --> 双击 "计算机" 红框内 鼠标 "单击" 后粘贴刚刚复制的 虚拟机"工作路径" --> 按键 "回车" 进入虚拟机系统存放目录!
  • 之前的章节中游戏中的player, enemy, bullet都是用的QgraphiscRectItem类的对象代替, 本小节将它们设置成为png格式的照片,背景也可以更换图片。 Player类更换图片比较容易,按照章节(7)的步骤增加资源文件,...
  • 李华明Himi 原创,转载务必明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/455.html11月28日:--------------------------------- 有的童鞋说添加嘞组件...
  • 数据结构在游戏中的简单应用

    千次阅读 2016-06-08 06:43:37
    在游戏的编写,不可避免的出现很多应用数据结构的地方,有些简单的游戏,只是由几个数据结构的组合,所以说,数据结构在游戏编程扮演着很重要的角色。  本文主要讲述数据结构在游戏中的应用,其中包括对链表、顺序表...
  • 2、管理3D设置中,更改以下选项(部分显卡可能会没有以下部分选项,可以不设置相应选项): 首选图形处理器更改为英伟达显卡 OpenGL渲染GPU更改为英伟达显卡 三重缓冲更改为【开】 低延迟模式更改为【超高】 ...
  • 前段时间接入sdk之后,发现游戏在真机运行正常,但是模拟器运行游戏莫名崩溃,于是猜测是sdk导致的。今天有时间来专门找问题所在。 方法:新建工程A,原始工程B。把B工程下的plugins文件夹导入A工程,打包a....
  • Windows Server 玩游戏设置详情攻略

    千次阅读 2009-01-08 17:19:00
    关于WHS的游戏性能,再次引出Windows 2003的游戏问题,这里要分几种情况(对Windows Server 2008同样适用): 1〉 问题:提示缺少文件、不出画面、片头动画自动退出、加载地图时异样、一打开就报错代表:《Count ...
  • 1.很多男孩子游戏的时候都不怎么里女朋友,也不陪女朋友,这样一来女朋友就很容易生气! 2.终于有一天呀,女朋友彻底生气了,有两种情况,(1.就是和男票分手,2.就是将男票的游戏删掉) ...
  • 李华明Himi 原创,转载务必明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/389.html 今天一个开发者问到我为什么游戏开发要删除项目下的hdpi、mdpi和ldpi文件夹;...
  • construct2能做什么construct2是一款跨平台二维游戏开发引擎,不需要编码,通过定义各个部件和事件完成html5的游戏开发。 该引擎可以将开发的封装成多种形式,如phonegap、cocoonjs,再用相应工具生成ios和android...
  • Unity,游戏。 本文设计了一个第一人称射击游戏的Demo开发过程,文中对射击游戏的基础功能做了一个详细介绍,适用于一个基础框架,可以用于一个射击游戏的完整开发,请品尝。
  • UE4 在游戏中使用Slate

    千次阅读 2016-11-21 21:52:07
    在游戏中使用Slate Slate用户界面架构 概述 Slate控件可以用于在游戏中创建平头显示信息(HUD)或其他用户界面(UI)元素, 比如菜单。您一般可以创建一个或多个 容器 控件,每个容器可以包含几...
  • 在游戏中使用面向对象的FSM

    千次阅读 2009-05-09 17:27:00
    在游戏中使用面向对象的FSM以前一直是用switch的状态机,因为J2ME没办法用太多类,现在改做c++了,终于可以试一试面向对象的状态机了,代码果然简洁了好多。参考的是《Programming Game AI by Example》第2章,大约...
  • 游戏服务器运行过程,每天都会产生大量log数据,包括数据库日志数据跟后台打印日志,需要定时清理 一.linux定时清理log文件 1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -...
  • 游戏设计笔记:删除对象

    千次阅读 2008-09-24 23:19:00
     删除游戏中不可以缺少的步骤,同样了解这个过程实际上是内存一种消亡的过程,为了释放内存所做的一些操作,那就是对象删除 问题一:在游戏结束后,我想把所有的容器的对象都删除那么我应该怎样做?书上都
  • 四叉树在游戏中的应用

    千次阅读 2017-03-28 17:50:54
    在游戏中检测物体之间的碰撞经常用到数据结构四叉树,基本构造思路是:树每个结点对应一个矩形,每个结点对应的矩形被其四个儿子结点拆成四部分, 一般为了方便划分,选用等分成四个面积相等的矩形。  插入的时间...
  • 使用静态网格物体设置碰撞(如果想更多了解游戏建模可以加小编游戏建模企鹅交流社团:1046777540,还可以领取免费的教程哦) 1、“编辑器脚本”>“静态网格物体”类别下,找到管理“静态网格物体”碰撞所需的...
  • 游戏开发的物理之布娃娃系统介绍设置布娃娃创造物理骨骼清理骨架碰撞形状调整关节调整模拟布娃娃碰撞层和遮罩 介绍 从3.1版开始,Godot支持布娃娃物理。Ragdolls依靠物理模拟来创建逼真的程序动画。它们许多游戏...
  • Unity版本:Unity 2018.2....Unity游戏开发官方入门教程:飞机大战(一)——创建新项目、导入资源、设置场景 Unity游戏开发官方入门教程:飞机大战(二)——创建飞船对象 Unity游戏开发官方入门教程:飞机大战(三...
  • Redis在游戏开发的应用

    千次阅读 2016-09-08 18:13:54
    Redis是一个新兴的NoSql数据缓存组件,与memcache类似,但是功能却比memcache多一些。首先,Redis和memcache都是基于内存的,所以读取和写入速度都非常快。...下面就Redis在游戏的开发应用做一些简单的介...
  • 关于Java游戏中实现暂停的讨论

    千次阅读 2009-05-15 15:39:06
    最近写了一个Swing版本的Snake程序,可是不太清楚怎么样来实现游戏中常见的暂停操作,所以我列出自己的一些方案,大家来讨论下什么样的方式会好些,还有就是如何更好的实现暂停这种方法。 方案1,直接利用状态...
  • 1.9 iTunes Connect创建... 你不知道如何iOS游戏中结合排行榜。 解决方案  iTunes Connect建立排行榜。 讨论  游戏中心的功能之一是iOS应用程序管理排行榜。举例来说,你可以编写一个竞技游戏
  •  摘 要:八叉树结构在游戏的场景渲染应用十分广泛,本文针对该结构大幅度优化运算效率的特点,将其作了适当改进,使其用于鼠标拾取技术,取得了不错的效果。要求对鼠标点击做出快速响应的游戏中,尤其是实时...
  • 因此对于更大一些的游戏,就需要设置远程资源服务器的方式 来加载更多的资源 首先官方文档(非常简略) http://docs.cocos.com/creator/manual/zh/publish/publish-wechatgame.html?h=remote 详细攻略如下 转载请...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,282
精华内容 39,712
关键字:

怎样在设置中删除游戏