在输入字段 c# 中的 Unity 上显示从日历中选择的日期

Posted

技术标签:

【中文标题】在输入字段 c# 中的 Unity 上显示从日历中选择的日期【英文标题】:Display Selected Date from Calendar on Unity in Input-field c# 【发布时间】:2020-06-24 00:06:57 【问题描述】:

Scene

我从头开始在 Unity 上创建了一个日历,并一直尝试在输入字段中显示所选日期(即,当用户从日历中选择特定日期时,该日期会在字段中显示相应的月份和年份)。自动取款机只显示第一天,月份和年份随着日历的滑动而变化。日历结果存储在“周”(天)和“月和年”下。我想让输入字段等于这些变量,但到目前为止我没有尝试过任何工作。我怎样才能让它工作? (任何提示和资源都会很棒!)

private List<Day> days = new List<Day>();
public Transform[] weeks;
public Text MonthAndYear;
public DateTime currDate = DateTime.Now;
public InputField Date;


private void Start()

    UpdateCalendar(DateTime.Now.Year, DateTime.Now.Month);


void UpdateCalendar(int year, int month)

    DateTime temp = new DateTime(year, month, 1);
    currDate = temp;
    MonthAndYear.text = temp.ToString("MMMM") + " " + temp.Year.ToString();
    int startDay = GetMonthStartDay(year, month);
    int endDay = GetTotalNumberOfDays(year, month);
    Date.text = currDate.ToString("dd.MM.yyyy");

【问题讨论】:

您如何检测选择了哪个日期? @HumanWrites 就是这样,它没有检测到选择了什么;我在整个过程中遇到问题。我一直在寻找任何可以帮助我解决这个问题的方法! 添加显示所有嵌套 UI 元素的场景层次结构的屏幕截图,我将添加一个解释一些可能方法的答案。如果屏幕截图也显示了您的日历,那将有所帮助。 嗨@HumanWrites,我添加了我的场景的sc - 它在描述的顶部,链接“场景”。也感谢您的时间和回复! 【参考方案1】:

您需要为 Days 预制件中的每个图像添加一个脚本,该脚本允许您设置天数并检测交互。我没有在 Unity/VS 中输入这个,所以它可能有一些小错误,但它会是这样的:

using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DayScript : MonoBehaviour, IPointerClickHandler 

    public int dayNumber;
    public GameObject dayText; // This is the Text component of the Image
    public Calendar cal; // This would be your Content Panel, which has the Calendar script attached.

    void Start() 
        dayText.GetComponent<Text>().text = dayNumber;
    

    public void OnPointerClick(PointerEventData evtData) 
        cal.SetSelectedDay(dayNumber);
    


然后在您的日历脚本中添加以下类成员和方法更改:

private int SelectedDay;

// Change your Start method slightly
void Start()

    SelectedDay = 1;
    UpdateCalendar(DateTime.Now.Year, DateTime.Now.Month);



public void SetSelectedDay(int day) 

    SelectedDay = day;
    UpdateCalendar(DateTime.Now.Year, DateTime.Now.Month);


// Slightly change your UpdateCalendar method so that it uses the SelectedDay method
void UpdateCalendar(int year, int month)

    DateTime temp = new DateTime(year, month, SelectedDay);
    currDate = temp;
    MonthAndYear.text = temp.ToString("MMMM") + " " + temp.Year.ToString();
    int startDay = GetMonthStartDay(year, month);
    int endDay = GetTotalNumberOfDays(year, month);
    Date.text = currDate.ToString("dd.MM.yyyy");

说明:

Unity UI 系统(不是最新的,而是 LTS 的)使用 Unity.EventSystems 来处理用户交互。这使我们可以访问一堆有用的界面来轻松处理诸如单击和拖动以及鼠标输入等操作。因此,我们将脚本添加到所需的 UI 对象(Days 预制件)并实现IPointerClickHandler interface。这需要我们添加一个public void OnPointerClick(PointerEventData evtData) 方法。每当用户单击附加的 UI 对象时,都会触发该方法。

之后,只需在点击发生时执行我们想要执行的操作即可。在这种情况下,我们将一个方法添加到更新 SelectedDay 变量的日历脚本中。我们在 UpdateCalendar 方法中使用 SelectedDay。然后,只要在 Day UI 对象上发生点击,我们就会调用 SetSelectedDay 方法。

附加评论

这段代码有点乱,应该重构以更好地分离关注点。让我知道它是怎么回事,因为正如我所说,我是即时写的,所以它可能有一些错误。如果需要,我会在答案中修复它们。

另一种方法可能是使用 C# 事件并在必要时注册处理程序,但这对于这个特定问题可能过于工程化。但是,如果您的问题空间变得更加复杂,您可以阅读C# event handling and delegates here.

【讨论】:

非常感谢您的详细回答!我现在正在努力,手指交叉它会很好的!我只是有一个问题(可能是一个愚蠢的问题),但是您添加的新游戏对象“dayText”是什么?它是做什么用的或分配给什么的? (我对整个编码很陌生,我正在尝试了解这些东西是如何工作的) 刚刚收到更新的评论 - 我非常感谢额外的解释,它真的很有帮助!我将再次将此信息用于其他功能,谢谢! (从谷歌或教程从头开始学习编码是一项艰巨的任务,因为它们不是从基础开始,而是使用需要自己进行另一轮研究的特定术语。教程使它看起来像是地球上最简单的事情,然后你就离开了代码中的错误时出现错误)对此非常感谢! dayText 对象将是 Days 预制件的 Text 子对象。我认为这就是您的预制件的设置方式。想法是,您使用脚本中的公共变量设置天数,然后脚本将其设置为预制件中 Text 对象的文本值。如果您的预制件设置不同,您可以更改它。 “从谷歌或教程从头开始学习编码是一件很困难的事情,因为它们不是从基础开始的,而是使用需要自己进行另一轮研究的特定术语”——你刚刚描述了我的整个编程生涯.不过别担心,如果你坚持下去,你会发现自己“啊哈!”时刻越来越频繁。 它现在可以工作并且在输入字段中也显示出来了,耶!但它只适用于六月,如果我在检查员中相应地指定了日期 - 就像你提到的那样,所以当我从八月选择一天时,假设它不起作用。我是否能够从我的脚本中完全删除 dayNumber 并让它读取日历上更新的任何一天?即它读取 UpdateCalendar 放入文本子项的任何一天。

以上是关于在输入字段 c# 中的 Unity 上显示从日历中选择的日期的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 Unity GUI 文本字段

在 jQuery 日历中突出显示数据库中的日期

php 事件日历PRO:从单个事件页面上显示删除PRO附加字段。

php 事件日历PRO:从单个事件页面上显示删除PRO附加字段。

C#实现日历样式的下拉式计算器

将日历上的日期与另一个字段匹配