Unity 设置软件使用期限
说明:前段时间公司有一个需求就是要为我们用Unity 开发的产品加个简单的使用限制,目的是为了交到客户手上演示的时候,有一个体验时间限制。 首先,解决这个需求有三种思路,第一种是设置使用次数,第二种是设置使用软件的时长,第三种是设置使用期限。今天我把三种思路都给大家演示一下。好,我们开始。
第一种:限制软件使用次数
1,创建一个名为Test_Times 的脚本,然后定义变量
public int times=10;
int i = 0;
private void Awake()
{
i = PlayerPrefs.GetInt("体验次数");
Debug.Log(i);
if (i >= times)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
i++;
PlayerPrefs.SetInt("体验次数", i);
}
2,为了测试,我们可以利用GUI把使用次数显示到屏幕上
private void OnGUI()
{
GUIStyle gs = new GUIStyle();
gs.fontSize = 20;
gs.normal.textColor = Color.white;
GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次", gs);
if (GUI.Button(new Rect(60, 60, 100, 30), "重置次数"))
{
PlayerPrefs.DeleteKey("体验次数");
i = 0;
GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次");
}
}
3,效果如下 设置使用次数的运行效果。
第二种:限制使用软件的时长
1,创建一个名为Test_GameTime 的脚本,然后定义变量
float time;
public float gameTime=300.0f;
private void Update()
{
time = Time.realtimeSinceStartup;
if (time <= gameTime)
{
return;
}
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
2,为了测试,我们可以利用GUI把使用次数显示到屏幕上
private void OnGUI()
{
GUIStyle gs = new GUIStyle();
gs.fontSize = 20;
gs.normal.textColor = Color.white;
GUI.Label(new Rect(30, 30, 200, 60), "体验版:体验时长" + (gameTime - time).ToString("f2"), gs);
}
3,效果如下 设置使用时长的效果
第三种:限制使用软件的期限
1,创建一个名为Test_SystemTime的脚本,然后定义变量
float curYear, curMonth, curDay, curHours, curMin, curSec;
public float year;
public float month;
public float day;
public float hours;
public float min;
public float sec;
private void Update()
{
curYear = System.DateTime.Now.Year;
curMonth = System.DateTime.Now.Month;
curDay = System.DateTime.Now.Day;
curHours = System.DateTime.Now.Hour;
curMin = System.DateTime.Now.Minute;
curSec = System.DateTime.Now.Second;
if (curYear > year)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curYear < year)
{
return;
}
else if (curYear == year)
{
if (curMonth > month)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curMonth < month)
{
return;
}
else if (curMonth == month)
{
if (curDay > day)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curDay < day)
{
return;
}
else if (curDay == day)
{
if (curHours > hours)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curHours < hours)
{
return;
}
else if (curHours == hours)
{
if (curMin > min)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curMin < min)
{
return;
}
else if (curMin == min)
{
if (curSec > sec)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curSec <= sec)
{
return;
}
}
}
}
}
}
}
2,为了测试,我们可以利用GUI把使用次数显示到屏幕上
private void OnGUI()
{
GUIStyle gs = new GUIStyle();
gs.fontSize = 20;
gs.normal.textColor = Color.white;
GUI.Label(new Rect(30, 30, 200, 60), "体验版:截止日期为" + year + "年" + month + "月" + day + "日" + min + "分" + sec + "秒", gs);
}
3,效果如下 设置使用期限的效果
好了,至此三种思路已介绍完毕!最后,再次奉上把三种方式融合到一块的方法,废话不多说,源代码奉上 1,TestEditor.cs脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
public override void OnInspectorGUI()
{
Test myKey = (Test)target;
myKey.isNormal = EditorGUILayout.Toggle("正式版", myKey.isNormal);
if(myKey.isNormal)
{
return;
}
myKey.experienceType = (ExperienceType)EditorGUILayout.EnumPopup("加密方式", myKey.experienceType);
if (myKey.experienceType == ExperienceType.ByTimes)
{
myKey.times = EditorGUILayout.IntField("体验次数", myKey.times);
}
if (myKey.experienceType == ExperienceType.BySystemTime)
{
myKey.year = EditorGUILayout.FloatField("截止到哪年", myKey.year);
myKey.month = EditorGUILayout.FloatField("截止到哪月", myKey.month);
myKey.day = EditorGUILayout.FloatField("截止到哪日", myKey.day);
myKey.hours = EditorGUILayout.FloatField("截止到几时", myKey.hours);
myKey.min = EditorGUILayout.FloatField("截止到几分", myKey.min);
myKey.sec = EditorGUILayout.FloatField("截止到几秒", myKey.sec);
}
if (myKey.experienceType == ExperienceType.ByGameTime)
{
myKey.gameTime = EditorGUILayout.FloatField("体验时长", myKey.gameTime);
}
}
}
2,Test.cs脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum ExperienceType
{
ByTimes,
BySystemTime,
ByGameTime
}
public class Test : MonoBehaviour
{
public bool isNormal;
int i = 0;
bool isByTimes;
float time;
bool isByGameTime;
float curYear, curMonth, curDay, curHours, curMin, curSec;
bool isBySystemTime;
public ExperienceType experienceType;
public int times;
public float year;
public float month;
public float day;
public float hours;
public float min;
public float sec;
public float gameTime;
private void Awake()
{
if (isNormal)
return;
switch (experienceType)
{
case ExperienceType.ByTimes:
isByTimes = true;
i = PlayerPrefs.GetInt("体验次数");
Debug.Log(i);
if (i >= times)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
i++;
PlayerPrefs.SetInt("体验次数", i);
break;
case ExperienceType.ByGameTime:
isByGameTime = true;
break;
case ExperienceType.BySystemTime:
isBySystemTime = true;
break;
}
}
private void FixedUpdate()
{
if (isByGameTime)
{
time = Time.realtimeSinceStartup;
if (time <= gameTime)
{
return;
}
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
if (isBySystemTime)
{
curYear = System.DateTime.Now.Year;
curMonth = System.DateTime.Now.Month;
curDay = System.DateTime.Now.Day;
curHours = System.DateTime.Now.Hour;
curMin = System.DateTime.Now.Minute;
curSec = System.DateTime.Now.Second;
if (curYear > year)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curYear < year)
{
return;
}
else if (curYear == year)
{
if (curMonth > month)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curMonth < month)
{
return;
}
else if (curMonth == month)
{
if (curDay > day)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curDay < day)
{
return;
}
else if (curDay == day)
{
if (curHours > hours)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curHours < hours)
{
return;
}
else if (curHours == hours)
{
if (curMin > min)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curMin < min)
{
return;
}
else if (curMin == min)
{
if (curSec > sec)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
#if UNITY_STANDALONE_WIN
Application.Quit();
#endif
#if UNITY_ANDROID
Application.Quit();
#endif
}
else if (curSec <= sec)
{
return;
}
}
}
}
}
}
}
}
private void OnGUI()
{
if (isByGameTime)
{
GUIStyle gs = new GUIStyle();
gs.fontSize = 20;
gs.normal.textColor = Color.white;
GUI.Label(new Rect(30, 30, 200, 60), "体验版:体验时长" + (gameTime - time).ToString("f2"), gs);
}
if (isByTimes)
{
GUIStyle gs = new GUIStyle();
gs.fontSize = 20;
gs.normal.textColor = Color.white;
GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次", gs);
if (GUI.Button(new Rect(60, 60, 100, 30), "重置次数"))
{
Reset();
GUI.Label(new Rect(30, 30, 200, 60), "体验版:剩余体验次数" + (times - i) + "次");
}
}
if (isBySystemTime)
{
GUIStyle gs = new GUIStyle();
gs.fontSize = 20;
gs.normal.textColor = Color.white;
GUI.Label(new Rect(30, 30, 200, 60), "体验版:截止日期为" + year + "年" + month + "月" + day + "日" + min + "分" + sec + "秒", gs);
}
}
public void Reset()
{
PlayerPrefs.DeleteKey("体验次数");
i = 0;
}
}
3,将TestEditor.cs脚本放到Editor文件夹下(没有此文件夹,那便创建一个),然后新建一个空物体挂上Test.cs脚本即可。效果如下: 在非正式版的情况下,我们可以在这三种方式中,任意选择限制方式,然后设置好值即可。
最后补充,第一次写博客,有写的不好的地方希望大家不要见怪,嘻嘻。。。
|