Unity 生成问题,可以多选,单选或者无答案自由选择。(代码存档)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 题目信息生成
/// 需要SyncObjLink3类统一管理问题专用HUD信息
/// Z 530
/// </summary>
public class ToggleControl : MonoBehaviour
{
    [Header("问题和多选答案信息设置")]
    public string QuestionText;
    public string[] AnswerText = { };
    public int[] RightIndex;
    //
    private int ChoosedRight = 0;
    private float WaitTime = 0.5f;
    //存放选中的toggle
    List<string> ClickToggleStrings = new List<string>();
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
    /// <summary>
    /// 在需要答题时执行一次此方法
    /// </summary>
    public void ShowQuestionMotion()
    {
        StartCoroutine(nameof(StepMotion));
        for (int i = 0; i < 6; i++)
        {
            //初始化显示项
            SyncObjLink3._instance.QuestionAnswerToggles[i].SetActive(true);
            //题目为空跳过
            if (AnswerText[i] == "")
            {
                SyncObjLink3._instance.QuestionAnswerToggles[i].SetActive(false);
                continue;
            }
            //答案项
            SyncObjLink3._instance.QuestionAnswerToggles[i].transform.GetChild(1).GetComponent<Text>().text = AnswerText[i];
            //将答案项选中状态重置
            SyncObjLink3._instance.QuestionAnswerToggles[i].GetComponent<Toggle>().isOn = false;
            ClickToggle(SyncObjLink3._instance.QuestionAnswerToggles[i], AnswerText[i]);
        }
        //移除监听
        SyncObjLink3._instance.SubmitBtn.onClick.RemoveAllListeners();
        //添加监听
        SyncObjLink3._instance.SubmitBtn.onClick.AddListener(()=>
        {
            //判断每次点击的正确数量是否等于设置的正确答案数量,且保存点击的答案数量是否等于设置的正确答案数量,
            //当两者都满足时,多选题回答正确。
            if (ChoosedRight == RightIndex.Length && ClickToggleStrings.Count == RightIndex.Length)
            {
                print("正确时:");
                SyncObjLink3._instance.SubmitBtn.onClick.RemoveAllListeners();
                if (transform.parent.GetComponent<EventActionMotion>().NextEvent != null)
                {
                    StartCoroutine(nameof(YielFrameUINext));
                }
            }
            else 
            {
                //具有正确答案的流程
                if(RightIndex.Length != 0)
                { 
                    print("错误时:");
                    SyncObjLink3._instance.FHudUI.SetActive(true);
                    Invoke(nameof(OnDisappear), 3f);
                }
                //没有正确答案的流程
                else
                {
                    //如果选择了指挥组
                    if(ClickToggleStrings.Contains("指挥组") && ClickToggleStrings.Count == 1)
                    {
                        print("指挥组");
                        SyncObjLink3._instance.QuestionHudUI.SetActive(false);
                        View_Main._instance.StartBoom0Events();
                    }
                    if (ClickToggleStrings.Contains("搜索标定组") && ClickToggleStrings.Count == 1)
                    {
                        print("搜索标定组");
                        SyncObjLink3._instance.QuestionHudUI.SetActive(false);
                        View_Main._instance.StartBoom1Events();
                    }
                    if (ClickToggleStrings.Contains("排爆组") && ClickToggleStrings.Count == 1)
                    {
                        print("排爆组");
                    }
                }
            }
        });
    }
    private void OnDisappear()
    {
        SyncObjLink3._instance.FHudUI.SetActive(false);
    }
    IEnumerator YielFrameUINext()
    {
        yield return new WaitForSeconds(1f);
        SyncObjLink3._instance.QuestionHudUI.SetActive(false);
        yield return new WaitForSeconds(2f);
        transform.parent.GetComponent<EventActionMotion>().NextEvent.Invoke();

    }
    /// <summary>
    /// 显示答题面板,赋值题目
    /// </summary>
    /// <returns></returns>
    IEnumerator StepMotion()
    {
        yield return new WaitForSeconds(WaitTime);
        SyncObjLink3._instance.QuestionHudUI.gameObject.SetActive(true);
        if (QuestionText != "")
        {
            SyncObjLink3._instance.QuestionText.text = QuestionText;
        }
    }
    /// <summary>
    /// 点击时
    /// </summary>
    /// <param name="obj">点击了?</param>
    /// <param name="toggleText">点击项的文字</param>
    private void ClickToggle(GameObject obj, string toggleText)
    {
        //先重置监听
        obj.transform.GetComponent<Toggle>().onValueChanged.RemoveAllListeners();
        //添加监听
        obj.transform.GetComponent<Toggle>().onValueChanged.AddListener(isOn =>
        {
            if (isOn)
            {
                ClickMethod(toggleText);
            }
            else
            {
                UNClickMethod(toggleText);
            }
        });
    }
    /// <summary>
    /// 选中后的触发效果
    /// </summary>
    /// <param name="toggleText"></param>
    private void ClickMethod(string toggleText)
    {
        //添加选中的toggle内容
        ClickToggleStrings.Add(toggleText);
        NowEventChooseItemIsTrue();
    }

    /// <summary>
    /// 取消选中的触发效果
    /// </summary>
    /// <param name="toggleText"></param>
    private void UNClickMethod(string toggleText)
    {
        //移除选中的toggle内容
        ClickToggleStrings.Remove(toggleText);
        NowEventChooseItemIsTrue();
    }
    /// <summary>
    /// 当前事件的所选择的题目是正确的吗?
    /// </summary>
    private void NowEventChooseItemIsTrue()
    {
        //无论每次是否选择正确,都将当前选择的正确数量归零,在下次点击时再次计算。
        ChoosedRight = 0;
        //记录每次点击正确的数量
        for (int j = 0; j < ClickToggleStrings.Count; j++)
        {
            for (int i = 0; i < RightIndex.Length; i++)
            {
                if (AnswerText[RightIndex[i]] == ClickToggleStrings[j])
                {
                    ChoosedRight++;
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值