在制作游戏的过程中,我们总要一次次的去测试一个或多个场景。当然整个游戏过程的速度也需要把控,因为为了达到想要的效果就必须不停地从头试玩游戏关卡。为了解决这个问题,我们需要一组灵活的用于作弊的子系统。
游戏中作弊是市面上很多游戏都在用的老方法。作弊系统能帮助开发和测试人员更好的测试游戏,而且最终发布时肯定会移除该系统,因为它能改变游戏的数值。移除已经实现的作弊系统可能会破坏整个产品的稳定性,因为它需要更改一些代码。还有一些称为作弊码的手段,甚至在某些网站上就能激活。

通常在游戏帮助中不会找到游戏内作弊的方法,因为游戏作者并不愿玩家作弊。但你可以在杂志或网上找到相关的作弊码。       

实现游戏作弊子系统

下面来讲讲如何实现一个简单的作弊系统,适用于PC和移动平台。主要需求就是不用键盘也能使用。方便起见我们把触摸和鼠标事件做同样的处理。然后创建任意类型的GUI。这里会用到有点过时但还能用的IMGUI。

激活作弊码列表

让激活作弊码列表的流程简单点,但绝不是随随便便就能做到的。这里我们设计为在2秒之内点击或触摸右上角5次即可激活。

using UnityEngine;
using System.Collections;
using System;
  
public class Cheats : MonoBehaviour
{
    // Activate corner area size by screen width percentage
    public float ActivateAreaSize = 0.1f;
     
    // How many clicks the player should do before cheats list will be visible
    public int ClicksCount = 5;
     
    // How many seconds player have to click/touch the screen
    public float WaitTime = 2;
     
    private float[] _clickTimes;
     
    private int _clickTimesIndex;
     
    private bool _active = false;
     
    void Start()
    {
        // create clicks array and reset it with float.MinValue
        _clickTimes = new float[ClicksCount];
        ResetClicks();
    }
     
    private void ResetClicks()
    {
        for (int i = 0; i < ClicksCount; i++)
        {
            _clickTimes = float.MinValue;
        }
    }
     
    void Update()
    {
        // check for click or touch and register it
        if (CheckClickOrTouch())
        {
            // click will be registered at time since level load
            _clickTimes[_clickTimesIndex] = Time.timeSinceLevelLoad;
            // each next click will be written on next array index or 0 if overflow
            _clickTimesIndex = (_clickTimesIndex + 1) % ClicksCount;
        }
         
        // check if cheat list should be activated
        if (ShouldActivate())
        {
            _active = true;
            ResetClicks();
        }
    }
     
    // checks if cheat list should be activated
    private bool ShouldActivate()
    {
        // check if all click/touches were made within WaitTime
        foreach(float clickTime in _clickTimes)
        {
            if (clickTime < Time.timeSinceLevelLoad - WaitTime)
            {
                // return false if any of click/touch times has been done earlier
                return false;
            }
        }
         
        // if we are here, cheat should be activated
        return true;
    }
     
    // returns true if there's click or touch within the activate area
    private bool CheckClickOrTouch()
    {
        // convert activation area to pixels
        float sizeInPixels = ActivateAreaSize * Screen.width;
         
        // get the click/touch position
        Vector2? position = ClickOrTouchPoint();
         
        if (position.HasValue) // position.HasValue returns true if there is a click or touch
        {
            // check if withing the range
            if (position.Value.x >= Screen.width - sizeInPixels && Screen.height - position.Value.y <= sizeInPixels)
            {
                return true;
            }
        }
         
        return false;
    }
     
    // checks for click or touch and returns the screen position in pixels
    private Vector2? ClickOrTouchPoint()
    {
        if (Input.GetMouseButtonDown(0)) // left mouse click
        {
            return Input.mousePosition;
        } else if (Input.touchCount > 0) // one or more touch
        {
            // check only the first touch
            Touch touch = Input.touches[0];
             
            // it should react only when the touch has just began
            if (touch.phase == TouchPhase.Began) {
                return touch.position;
            }
        }
         
        // null if there's no click or touch
        return null;
    }
     
    void OnGUI()
    {
        if (_active)
        {
            // display cheats list here...
        }
    }
     
}

上面的代码相当长,但这只是基本实现。主要功能是:
1、监听所有点击和触摸事件。
2、检测点击或触摸是否在有效的屏幕范围内。
3 、检测最后5次点击是否在指定时间内完成。
它还是可配置的!在OnGUI函数内加入绘制GUI以及激活作弊码的代码:

void OnGUI()
   {
       if (_active)
       {
           DisplayCheat("Close Cheat Menu", () => _active = false);
           DisplayCheat("Test Cheat 1", () => Debug.Log("Test cheat Activated!"));
           DisplayCheat("Inverse Gravity", () => Physics.gravity = -Physics.gravity);
       }
   }
    
   private void DisplayCheat(string cheatName, Action clickedCallback)
   {
       if (GUILayout.Button("Cheat: " + cheatName))
       {
           clickedCallback();
       }
   }

真的很简单。作弊列表显示为一排可点击的按钮。点击按钮后执行回调函数。第一个按钮用于关闭作弊列表。现在单击右上角5次即可看到作弊列表显示在屏幕上。

如果你想看看效果。。。

欢迎下载工程文件,其中包含上述所有脚本和一个测试场景。工程使用Unity5.3.0制作,确保使用Unity5.3或更高版本。

来源:Unity官方社区