在输入字段 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.
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.