forked from zxl/LaboratoryProtection
299 lines
7.6 KiB
C#
299 lines
7.6 KiB
C#
|
using Sirenix.OdinInspector;
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
[CreateAssetMenu(fileName = "QuestionDatabase", menuName = "Database/QuestionDatabase", order = 1)]
|
|||
|
public partial class QuestionDatabase : SerializedScriptableObject
|
|||
|
{
|
|||
|
public enum QusetionType
|
|||
|
{
|
|||
|
Single, //单选
|
|||
|
Mulitiple, //多选
|
|||
|
}
|
|||
|
|
|||
|
[Flags]
|
|||
|
public enum Option
|
|||
|
{
|
|||
|
Nil = 0,
|
|||
|
_0 = 1 << 0,
|
|||
|
_1 = 1 << 1,
|
|||
|
_2 = 1 << 2,
|
|||
|
_3 = 1 << 3,
|
|||
|
_4 = 1 << 4,
|
|||
|
_5 = 1 << 5,
|
|||
|
_6 = 1 << 6,
|
|||
|
_7 = 1 << 7,
|
|||
|
_8 = 1 << 8,
|
|||
|
_9 = 1 << 9,
|
|||
|
_10 = 1 << 10,
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private Option Switch(int num)
|
|||
|
{
|
|||
|
return (Option)(1 << num);
|
|||
|
}
|
|||
|
private char[] Switch2ABC(Option option)
|
|||
|
{
|
|||
|
var value = new List<char>();
|
|||
|
for (int i = 0; i < 10; i++)
|
|||
|
{
|
|||
|
var temp = (Option)(1 << i);
|
|||
|
if ((option & temp) == temp)
|
|||
|
{
|
|||
|
value.Add((char)(65 + i));
|
|||
|
}
|
|||
|
}
|
|||
|
return value.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_EDITOR
|
|||
|
public partial class QuestionDatabase
|
|||
|
{
|
|||
|
[TextArea(4, 100)]
|
|||
|
public string allStrs;
|
|||
|
[TableList(ShowIndexLabels = true)]
|
|||
|
public List<Data> datas = new List<Data>();
|
|||
|
public class Data
|
|||
|
{
|
|||
|
[TextArea(7, 10)]
|
|||
|
public string title;
|
|||
|
|
|||
|
[TextArea(7, 10)]
|
|||
|
public string tempOptions;
|
|||
|
public List<string> options;
|
|||
|
[TableColumnWidth(80, resizable: false)]
|
|||
|
public QusetionType type;
|
|||
|
[TableColumnWidth(80, resizable: false)]
|
|||
|
public Option rightAnswer;
|
|||
|
[TableColumnWidth(80, resizable: false)]
|
|||
|
public int score;
|
|||
|
public Data()
|
|||
|
{
|
|||
|
title = string.Empty;
|
|||
|
options = new List<string>(4);
|
|||
|
type = QusetionType.Single;
|
|||
|
rightAnswer = Option.Nil;
|
|||
|
score = 0;
|
|||
|
}
|
|||
|
|
|||
|
[TableColumnWidth(30)]
|
|||
|
[Button, VerticalGroup("Actions")]
|
|||
|
public void CreateOption()
|
|||
|
{
|
|||
|
if (tempOptions != string.Empty)
|
|||
|
{
|
|||
|
options = tempOptions
|
|||
|
.Split('\n')
|
|||
|
.Where(_ => _ != string.Empty)
|
|||
|
.Select(_ => {
|
|||
|
if (_.Length > 1 && _[1] == '.' || _[1] == '.')
|
|||
|
{
|
|||
|
var newStr = new string(_.Skip(3).ToArray());
|
|||
|
newStr = newStr.Replace(" ", "");
|
|||
|
return newStr;
|
|||
|
}
|
|||
|
return _;
|
|||
|
})
|
|||
|
.ToList();
|
|||
|
tempOptions = string.Empty;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[TableColumnWidth(30)]
|
|||
|
[Button, VerticalGroup("Actions")]
|
|||
|
public void CreateAll()
|
|||
|
{
|
|||
|
var all = tempOptions
|
|||
|
.Split('\n')
|
|||
|
.Select(_ => _.Replace(" ", ""))
|
|||
|
.Select(_ => _.Replace("\t", ""))
|
|||
|
.Where(_ => _ != string.Empty)
|
|||
|
.Select(_ => {
|
|||
|
if (_.Length > 1)
|
|||
|
{
|
|||
|
var first = _.IndexOfAny(new[] { '.', '.' });
|
|||
|
|
|||
|
if (_[first + 1] == ' ')
|
|||
|
{
|
|||
|
first += 1;
|
|||
|
}
|
|||
|
var newStr = new string(_.Substring(first + 1));
|
|||
|
return newStr;
|
|||
|
}
|
|||
|
return _;
|
|||
|
})
|
|||
|
.ToList();
|
|||
|
this.title = all[0];
|
|||
|
all.RemoveAt(0);
|
|||
|
var answer = all[all.Count - 1];
|
|||
|
var abc = answer.Replace("正确答案:", "");
|
|||
|
all.RemoveAt(all.Count - 1);
|
|||
|
if (abc.Length > 1)
|
|||
|
{
|
|||
|
type = QusetionType.Mulitiple;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
type = QusetionType.Single;
|
|||
|
}
|
|||
|
Debug.Log(this.Switch(abc));
|
|||
|
rightAnswer = this.Switch(abc);
|
|||
|
options = all.ToList();
|
|||
|
}
|
|||
|
private Option Switch(string str)
|
|||
|
{
|
|||
|
var chars = str.ToCharArray().Select(_ => (int)_ - 65);
|
|||
|
var options = chars.Select(_ => (int)Mathf.Pow(2, _));
|
|||
|
var result = 0;
|
|||
|
foreach (var item in options)
|
|||
|
{
|
|||
|
result |= item;
|
|||
|
}
|
|||
|
return (Option)result;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[Button]
|
|||
|
private void HandleAll()
|
|||
|
{
|
|||
|
var all = this.allStrs
|
|||
|
.Split('\n')
|
|||
|
.Where(x => x.Length > 0)
|
|||
|
.Select(_ => _.Replace(" ", ""))
|
|||
|
.Select(_ => _.Replace("\t", ""));
|
|||
|
|
|||
|
var list = new List<StringBuilder>();
|
|||
|
var temp = new StringBuilder();
|
|||
|
foreach (var item in all)
|
|||
|
{
|
|||
|
temp.AppendLine(item);
|
|||
|
if (item.Contains("正确答案") == true)
|
|||
|
{
|
|||
|
list.Add(temp);
|
|||
|
temp = new StringBuilder();
|
|||
|
}
|
|||
|
}
|
|||
|
var array = new QuestionDatabase.Data[list.Count];
|
|||
|
datas = array.ToList();
|
|||
|
for (int i = 0; i < list.Count; i++)
|
|||
|
{
|
|||
|
datas[i] = new QuestionDatabase.Data();
|
|||
|
datas[i].tempOptions = list[i].ToString();
|
|||
|
datas[i].CreateAll();
|
|||
|
}
|
|||
|
this.SetType();
|
|||
|
this.Sync();
|
|||
|
}
|
|||
|
|
|||
|
[Button]
|
|||
|
private void AddData()
|
|||
|
{
|
|||
|
if (datas == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
datas.Add(new Data()
|
|||
|
{
|
|||
|
options = { "", "", "", "" },
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
[Button]
|
|||
|
private void AddTemplate()
|
|||
|
{
|
|||
|
if (datas == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
var template = datas[0];
|
|||
|
var data = new Data()
|
|||
|
{
|
|||
|
title = template.title,
|
|||
|
options = template.options,
|
|||
|
rightAnswer = template.rightAnswer,
|
|||
|
score = template.score,
|
|||
|
tempOptions = template.tempOptions,
|
|||
|
type = template.type,
|
|||
|
};
|
|||
|
datas.Add(data);
|
|||
|
this.Sync();
|
|||
|
}
|
|||
|
|
|||
|
[Button]
|
|||
|
private void SimplifyData()
|
|||
|
{
|
|||
|
if (datas == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
foreach (var item in datas)
|
|||
|
{
|
|||
|
item.options = item.options.Where(_ => _ != string.Empty).ToList();
|
|||
|
}
|
|||
|
this.datas.RemoveAll(_ => string.IsNullOrEmpty(_.title) == true);
|
|||
|
this.Sync();
|
|||
|
}
|
|||
|
|
|||
|
[Button()]
|
|||
|
private void Sync()
|
|||
|
{
|
|||
|
#if UNITY_EDITOR
|
|||
|
UnityEditor.EditorUtility.SetDirty(this);
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
[Button()]
|
|||
|
private void SetType()
|
|||
|
{
|
|||
|
if (datas == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
foreach (var item in datas)
|
|||
|
{
|
|||
|
var bitArray = new BitArray(BitConverter.GetBytes((int)item.rightAnswer).ToArray());
|
|||
|
var count = 0;
|
|||
|
for (int i = 0; i < bitArray.Length; i++)
|
|||
|
{
|
|||
|
if (bitArray[i] == true)
|
|||
|
{
|
|||
|
count++;
|
|||
|
}
|
|||
|
}
|
|||
|
Debug.Log(count);
|
|||
|
if (count > 1)
|
|||
|
{
|
|||
|
item.type = QusetionType.Mulitiple;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
item.type = QusetionType.Single;
|
|||
|
}
|
|||
|
}
|
|||
|
this.Sync();
|
|||
|
}
|
|||
|
|
|||
|
[Button()]
|
|||
|
private void ShowAllCount()
|
|||
|
{
|
|||
|
var databases = Resources.FindObjectsOfTypeAll<QuestionDatabase>();
|
|||
|
var count = 0;
|
|||
|
foreach (var item in databases)
|
|||
|
{
|
|||
|
count += item.datas.Count;
|
|||
|
}
|
|||
|
Debug.Log(count);
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
|