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

Display Selected Date from Calendar on Unity in Input-field c#

Scene

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

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");

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

}

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

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 变量的 Calendar 脚本添加了一个方法。我们在 UpdateCalendar 方法中使用 SelectedDay。然后,只要在 Day UI 对象上发生点击,我们就会调用 SetSelectedDay 方法。

附加评论

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

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