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

C# 在输入字段c的Unity上显示从日历中选择的日期#,c#,datetime,unity3d,c#-2.0,C#,Datetime,Unity3d,C# 2.0,我从头开始在Unity上创建了一个日历,并一直尝试在输入字段中显示所选日期(即,当用户从日历中选择特定日期时,该日期会在字段中显示相应的月份和年份)。Atm只显示第一天,月份和年份在日历中以一种轻快的方式变化。日历结果存储在“周”(天数)和“月和年”下。我想让输入字段等于这些变量,但到目前为止,我所尝试的都没有成功。我怎样才能让它工作?(任何提示和资源都很好!) private List days=new List(); 公众假期[]周; 每年公布的公共文本; public DateTime c

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

private List days=new List();
公众假期[]周;
每年公布的公共文本;
public DateTime currDate=DateTime.Now;
公共输入字段日期;
私有void Start()
{
UpdateCalendar(DateTime.Now.Year,DateTime.Now.Month);
}
void UpdateCalendar(整数年,整数月)
{
DateTime temp=新的日期时间(年、月、1);
currDate=温度;
MonthAndYear.text=temp.ToString(“MMMM”)+“”+temp.Year.ToString();
int startDay=GetMonthStartDay(年、月);
int endDay=获取总天数(年、月);
Date.text=currDate.ToString(“dd.MM.yyyy”);

您需要在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);
    }

}
说明:

Unity UI系统(不是最新的,而是LTS系统)使用Unity.EventSystems来处理用户交互。这使我们能够访问一系列有用的界面,以便轻松处理单击、拖动和鼠标输入等操作。因此,我们将脚本添加到所需的UI对象(Days预置)中我们实现了。这需要我们添加一个
public void on pointer click(PointerEventData evtData)
方法。每当用户单击附加的UI对象时,该方法都将被激发

在这之后,我们只需要在单击发生时执行我们想要执行的操作。在本例中,我们向日历脚本添加一个方法来更新SelectedDay变量。我们在UpdateCalendar方法中使用该SelectedDay。然后,每当在Day UI对象上发生单击时,我们调用SetSelectedDay方法

其他评论

这段代码有点凌乱,应该进行重构以更好地分离关注点。请告诉我它是如何运行的,因为正如我所说,我是动态编写的,所以可能会有一些错误。如果需要,我会在答案中修复它们


另一种方法可能是根据需要使用C#events和注册处理程序,但这可能是对这个特定问题的过度设计。不过,如果您的问题空间变得更复杂,您可以阅读

如何检测已选择的日期?@HumanWrites就是这样,它不会检测已选择的日期;我在整个过程中遇到了问题。我一直在寻找任何可以帮助我的东西!添加一个场景层次的屏幕截图,显示所有嵌套的UI元素,我将添加一个解释一些可能的方法的答案。如果屏幕截图还显示了你的日历,那将有所帮助。Hi@HumanWrites,我添加了一个sce的scne-它位于描述的顶部,链接“场景”。也感谢您的时间和回复!非常感谢您的详细回答!我现在正在努力,祈祷一切顺利!我只是有一个问题(可能是个愚蠢的问题),但您添加的新游戏对象“dayText”是什么?它用于什么或分配给什么?(我对整个编码工作还很陌生,我正在努力学习这些东西是如何工作的)刚刚得到最新的评论-我真的很感谢额外的解释,它真的很有帮助!我也会将这些信息用于其他功能,谢谢!(从Google或教程中从头开始学习编码是一件困难的事情,因为他们不是从基础开始,而是使用需要自己进行另一轮研究的特定术语。而教程让人觉得这是地球上最简单的事情,然后代码中会一个接一个地出现错误)非常感谢!dayText对象将是Days预置的文本子对象。我假设预置就是这样设置的。想法是,在脚本中使用公共变量设置一天的数量,然后脚本将其设置为预置中文本对象的文本值。您不能更改如果你的预设设置不一样,那该怎么办呢。“从谷歌或教程上从头开始学习编码是一件很困难的事,因为它们不是从基础开始,而是使用需要自己进行另一轮研究的特定术语”——你刚刚描述了我的整个编程生涯。不过,别担心,如果你坚持不懈,你会发现自己有很多困难“啊哈!"瞬间越来越频繁。它现在可以工作,并显示在输入字段中,耶!但它只适用于6月份,如果我在检查器中相应地指定了日期,就像你提到的,那么当我从8月份选择一天时,比方说,它不工作。我能从脚本中完全删除日期吗让它读取日历上更新的任何一天?也就是说,它读取UpdateCalendar放入文本子项中的任何一天。
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");
}