找回密码
 立即注册
查看: 364|回复: 0

Unity中,允许用户通过滑动条或输入值的方式设置参数值

[复制链接]
发表于 2022-5-9 18:38 | 显示全部楼层 |阅读模式
需求

游戏中的某项参数,允许玩家自行配置。
提供2种配置方式:滑动条、直接输入。
参数值是有限制范围的(最小最大值)。

示意如下:最小值0.1,最大值10,限制位数为小数点后2位。


在游戏内调整参数值.gif

思路

当玩家通过前述任一一种方式设置值时,需同时修改滑动条(scrollBar)、输入框(inputField)对应的值。
实现

制作一个GameObject,其层级结构如下图


image.png

ConfigParamInputCtr.cs
在Init中传入:最小值、最大值、初始值、限制位数到小数点后几位(至少是0位,即该参数为整数)。
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;/// <summary>/// 输入配置参数控制:ScrollBar+InputField/// </summary>public class ConfigParamInputCtr : MonoBehaviour{    [SerializeField]    private Scrollbar _scrollBar;    [SerializeField]    private InputField _inputField;    private float _cur;    public float Value    {        get { return _cur; }    }    private float Min{ get; set; }    private float Max{ get; set; }    public int DecimalPlaceCnt{ get; set; }    /*    // 测试    private void Start()     {        Init(1, 10, 3, 0);    }    */    private void OnDestroy()    {        Destroy();    }        public void Init(float min, float max, float cur, int decimalPlaceCnt = 2)    {        Min = min;        Max = max;        DecimalPlaceCnt = decimalPlaceCnt;        SetValue(cur);        _scrollBar.onValueChanged.AddListener(OnScrollBarValueChanged);        _inputField.onEndEdit.AddListener(OnInputFieldEndEdit);        _inputField.contentType = InputField.ContentType.DecimalNumber;    }        public void Destroy()    {        _scrollBar.onValueChanged.RemoveListener(OnScrollBarValueChanged);        _inputField.onEndEdit.RemoveListener(OnInputFieldEndEdit);    }    private void OnScrollBarValueChanged(float value)    {        SetValue(Min + (Max - Min) * value);    }    private void OnInputFieldEndEdit(string value)    {        if (float.TryParse(value, out float v))        {            SetValue(v);        }    }    public void SetValue(float value)    {        int factor = (int)(Mathf.Pow(10, DecimalPlaceCnt));        value = (int)(value * factor) / (float)factor;        _cur = Mathf.Clamp(value, Min, Max);        _scrollBar.SetValueWithoutNotify((Value - Min) / (Max - Min));        _inputField.SetTextWithoutNotify(Value.ToString());    }}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 12:25 , Processed in 0.091514 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表