using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using Object = UnityEngine.Object;

//日期类型
public enum E_CalendarType
{
Day,
Month,
Year
}

//语言类型
public enum E_DisplayType
{
Standard,
Chinese
}

public class Clendar : UIBehaviour
{

private DateTime m_selectDateTime = DateTime.Today;  //今天日期
private DateTime m_updateDateTime = DateTime.Today;private readonly CalendarData m_calendarData = new CalendarData();  //日期计算类
private Transform m_TransForm = null;[HideInInspector]
public E_CalendarType CalendarType = E_CalendarType.Day;//日期类型
[HideInInspector]
public E_DisplayType DisplayType = E_DisplayType.Chinese;//语言类型private Text _timeButtonText = null;
private GameObject _weekGameObject = null; //控件 周
private GameObject _dayGameObject = null;  //控件 天
private GameObject _monthGameObject = null;  //控件 月
private readonly List<DMY> _daysPool = new List<DMY>(); //列表 天
private readonly List<DMY> _monthYearPool = new List<DMY>(); //列表 月protected override void Awake()
{m_TransForm = transform;_timeButtonText = m_TransForm.Find("Title/TimeButton/Text").GetComponent<Text>();_weekGameObject = m_TransForm.Find("Container/Weeks").gameObject;_dayGameObject = m_TransForm.Find("Container/Days").gameObject;_monthGameObject = m_TransForm.Find("Container/Months").gameObject;var weekPrefab = m_TransForm.Find("Container/Weeks/WeekTemplate").gameObject; //预制体 周var dayPrefab = m_TransForm.Find("Container/Days/DayTemplate").gameObject; //预制体 天var monthPrefab = m_TransForm.Find("Container/Months/MonthTemplate").gameObject; //预制体 月//初始化生成日期GenerateWeeks(weekPrefab, _weekGameObject.transform);GenerateDays(dayPrefab, _dayGameObject.transform);GenerateMonths(monthPrefab, _monthGameObject.transform);//点击事件绑定m_TransForm.Find("Title/TimeButton").GetComponent<Button>().onClick.AddListener(OnTimeButtonClick);m_TransForm.Find("Title/NextButton").GetComponent<Button>().onClick.AddListener(OnNextButtonClick);m_TransForm.Find("Title/LastButton").GetComponent<Button>().onClick.AddListener(OnLastButtonClick);Refresh();
}//选择日期按钮
private void OnTimeButtonClick()
{if (CalendarType == E_CalendarType.Month)CalendarType = E_CalendarType.Year;if(CalendarType == E_CalendarType.Day){CalendarType = E_CalendarType.Month;calendarTypeChange(false);}Refresh();
}//下一页
private void OnNextButtonClick()
{if (CalendarType == E_CalendarType.Day){m_selectDateTime = m_selectDateTime.AddMonths(1);m_updateDateTime = m_updateDateTime.AddMonths(1);}else if (CalendarType == E_CalendarType.Month){m_selectDateTime = m_selectDateTime.AddYears(1);m_updateDateTime = m_updateDateTime.AddYears(1);}else{m_selectDateTime = m_selectDateTime.AddYears(12);m_updateDateTime = m_updateDateTime.AddYears(12);}Refresh();
}//上一页
private void OnLastButtonClick()
{if (CalendarType == E_CalendarType.Day){m_selectDateTime = m_selectDateTime.AddMonths(-1);m_updateDateTime = m_updateDateTime.AddMonths(-1);}else if (CalendarType == E_CalendarType.Month){m_selectDateTime = m_selectDateTime.AddYears(-1);m_updateDateTime = m_updateDateTime.AddMonths(-1);}else{m_selectDateTime = m_selectDateTime.AddYears(-12);m_updateDateTime = m_updateDateTime.AddYears(-12);}Refresh();
}//周的生成
private void GenerateWeeks(GameObject weekPrefab, Transform parent)
{for (int i = 0; i < 7; i++){GameObject week = prefabGenerate(weekPrefab, parent);week.GetComponent<Text>().text = GetWeekName(i.ToString());}Destroy(weekPrefab);
}//日的生成
private void GenerateDays(GameObject dayPrefab, Transform parent)
{for (int i = 0; i < 42; i++){GameObject day = prefabGenerate(dayPrefab, parent);DMY dmy = day.AddComponent<DMY>();day.GetComponent<Button>().onClick.AddListener(() =>{m_updateDateTime = dmy.DateTime;Refresh();});_daysPool.Add(dmy);}Destroy(dayPrefab);
}//月的生成
private void GenerateMonths(GameObject monthPrefab, Transform parent)
{for(int i = 0; i < 12; i++){GameObject month = prefabGenerate(monthPrefab, parent);DMY dmy = month.AddComponent<DMY>();dmy.GetComponent<Button>().onClick.AddListener(() =>{m_updateDateTime = dmy.DateTime;if(CalendarType == E_CalendarType.Month){calendarTypeChange(true);CalendarType = E_CalendarType.Day;}if(CalendarType == E_CalendarType.Year){CalendarType = E_CalendarType.Month;}Refresh();});_monthYearPool.Add(dmy);}Destroy(monthPrefab);}//预制体生成
private GameObject prefabGenerate(GameObject prefab, Transform parent)
{GameObject go = Object.Instantiate(prefab);go.transform.SetParent(parent);go.transform.localScale = Vector3.one;return go;
}//获取周名称
private string GetWeekName(string weekName)
{switch (DisplayType){case E_DisplayType.Standard:switch (weekName){case "0":return "SunDay";case "1":return "Monday";case "2":return "Tuesday";case "3":return "Wendesday";case "4":return "Thursday";case "5":return "Friday";case "6":return "Saturfay";default:return "";}case E_DisplayType.Chinese:switch (weekName){case "0":return "日";case "1":return "一";case "2":return "二";case "3":return "三";case "4":return "四";case "5":return "五";case "6":return "六";default:return "";}              default:return "";}}//改变日期类型
private void calendarTypeChange(bool isDays)
{_weekGameObject.SetActive(isDays);_dayGameObject.SetActive(isDays);_monthGameObject.SetActive(!isDays);
}//刷新日期数据
private void Refresh()
{RefreshTimeButtonContent();RefreshCalendar();
}//更新日期列表
private void RefreshCalendar()
{if (CalendarType == E_CalendarType.Day) RefreshDays(m_calendarData.Days(m_selectDateTime));else if (CalendarType == E_CalendarType.Month) RefreshMonths(m_calendarData.Months(m_selectDateTime));else RefreshYears(m_calendarData.Years(m_selectDateTime));
}//刷新时间按钮的时间数据
private void RefreshTimeButtonContent()
{switch (CalendarType){case E_CalendarType.Day:if (DisplayType == E_DisplayType.Standard) _timeButtonText.text = m_updateDateTime.ToShortDateString();else _timeButtonText.text = m_updateDateTime.Year + "年" + m_updateDateTime.Month + "月" + m_updateDateTime.Day + "日";break;case E_CalendarType.Month:if (DisplayType == E_DisplayType.Standard) _timeButtonText.text = m_updateDateTime.Year + "/" + m_updateDateTime.Month;else _timeButtonText.text = m_updateDateTime.Year + "年" + m_updateDateTime.Month + "月";break;case E_CalendarType.Year:if (DisplayType == E_DisplayType.Standard) _timeButtonText.text = m_updateDateTime.Year.ToString();else _timeButtonText.text = m_updateDateTime.Year.ToString();break;}
}//更新天
private void RefreshDays(List<DateTime> dateTimes)
{for(int i = 0; i < _daysPool.Count; i++){var fontColor = Color.green;if (dateTimes[i].Month != m_selectDateTime.Month){fontColor = Color.white;          }_daysPool[i].SetDay(dateTimes[i], DisplayType, fontColor);}
}//更新月
private void RefreshMonths(List<DateTime> dateTimes)
{for(int i = 0; i < _monthYearPool.Count; i++){_monthYearPool[i].SetMonth(dateTimes[i], DisplayType);}
}//更新年
private void RefreshYears(List<DateTime> dateTimes)
{for(int i = 0; i < _monthYearPool.Count; i++){_monthYearPool[i].SetYear(dateTimes[i], DisplayType);}
}public class CalendarData
{//计算出需要显示的42天的DateTime值public List<DateTime> Days(DateTime month){List<DateTime> days = new List<DateTime>();DateTime firstDay = new DateTime(month.Year, month.Month, 1);DayOfWeek week = firstDay.DayOfWeek;int lastMonthDays = (int)week;if (lastMonthDays.Equals(0))lastMonthDays = 7;for (int i = lastMonthDays; i > 0; i--){days.Add(firstDay.AddDays(-i));}for (int i = 0; i < 42 - lastMonthDays; i++){days.Add(firstDay.AddDays(i));}return days;}//计算出12个月的DateTime的值public List<DateTime> Months(DateTime year){List<DateTime> months = new List<DateTime>();DateTime fiestMonth = new DateTime(year.Year, 1, 1);months.Add(fiestMonth);for (int i = 1; i < 12; i++){months.Add(fiestMonth.AddMonths(i));}return months;}public List<DateTime> Years(DateTime year){List<DateTime> years = new List<DateTime>();for (int i = 5; i > 0; i--){years.Add(year.AddYears(-i));}for (int i = 0; i < 7; i++){years.Add(year.AddYears(i));}return years;}
}public class DMY : UIBehaviour
{public DateTime DateTime { get; set; }private Text _text = null;protected override void Awake(){_text = transform.Find("Text").GetComponent<Text>();}public void SetDay(DateTime datetime, E_DisplayType displayType, Color fontColor){Debug.Log("时间:" + datetime + "/n");DateTime = datetime;_text.text = datetime.Day.ToString();_text.color = fontColor;}public void SetMonth(DateTime datetime, E_DisplayType displayType){DateTime = datetime;_text.text = getMonthString(datetime.Month.ToString(), displayType);}public void SetYear(DateTime datetime, E_DisplayType displayType){DateTime = datetime;_text.text = datetime.Year.ToString();}private string getMonthString(string month, E_DisplayType displayType){switch (displayType){case E_DisplayType.Standard:switch (month){case "1":return "Jan";case "2":return "Feb";case "3":return "Mar";case "4":return "Apr";case "5":return "May";case "6":return "Jun";case "7":return "Jul";case "8":return "Aug";case "9":return "Sep";case "10":return "Oct";case "11":return "Nov";case "12":return "Dec";default:return "";}case E_DisplayType.Chinese:switch (month){case "1":return "一月";case "2":return "二月";case "3":return "三月";case "4":return "四月";case "5":return "五月";case "6":return "六月";case "7":return "七月";case "8":return "八月";case "9":return "九月";case "10":return "十月";case "11":return "十一月";case "12":return "十二月";default:return "";}default:return "";}}
}

}

Unity版本 2018.3.8
工程地址: https://download.csdn.net/download/XiFeng__/12109465

Unity日历组件制作相关推荐

  1. 【Unity】unity 日历制作

    关于日历的制作 其实是非常简单的 博主一开始 想的很复杂 后来经过研究发现  核心代码 就一句 day_Temp = DateTime.DaysInMonth (year, month); DateT ...

  2. 组件分享之前端组件——甘特图时间表时间线日历组件

    组件分享之前端组件--甘特图时间表时间线日历组件 背景 近期正在探索前端.后端.系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组 ...

  3. Unity 4 3 制作一个2D横版射击游戏 2

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在上一篇 ...

  4. Cinemachine教程 | Unity中如何制作路径动画?

    摘要:在Unity中制作路径动画是有挺多方式的,基于Cinemachine的Dolly Path是一个简单便捷的方法,咱们来快速的学习一下吧! 洪流学堂,让你快人几步.你好,我是跟着大智(VX: zh ...

  5. swiftui动画之tab自定义切换动画_Unity动画系统详解1:在Unity中如何制作动画?

    摘要:在场景中加入动态的物体,可以让整个场景更加生动.真实.Unity场景中的物体可以通过制作动画,让物体动起来.简单的动画如物体的移动.旋转(比如旋转的风扇.闪烁不定的灯泡等),复杂的动画如游戏中角 ...

  6. Unity动画系统详解1:在Unity中如何制作动画?

    摘要:在场景中加入动态的物体,可以让整个场景更加生动.真实.Unity场景中的物体可以通过制作动画,让物体动起来.简单的动画如物体的移动.旋转(比如旋转的风扇.闪烁不定的灯泡等),复杂的动画如游戏中角 ...

  7. 【Unity 2017.3 制作安卓2D单机手游】2.这就开始做

    这就开始做 关于Unity的介绍以及如何创建项目,我就不多说了,因为百度很容易.现在就开始直接做,因为我也是要边做边学,所以必定会有很多不足.大佬们觉得哪里不对,欢迎指正! 开发环境 windows1 ...

  8. 使用Unity的UGUI制作带时间头的相册

    Unity  UGUI相册制作并且加上时间头的效果 在介绍排版之前需要先了解一下Unity中的排版布局方式的三个组件 1.Horizontal Layout Group(水平布局) 1.Padding ...

  9. Unity教程之-制作闪亮的星星Star(三):给Star创建Unity Editor编辑器

    继续上篇文章<Unity教程之-制作闪亮的星星Star(二):创建Shader>,本篇我们来讲解 unity star editor的创建! 建立编辑器 Creating the Insp ...

最新文章

  1. linux 命令读db文件格式,使用linux的db_load命令生成db数据库
  2. Python基本类型-字典
  3. alinq mysql_ALinq让Mysql变得如此简单_MySQL
  4. HTML如何添加锚点,我先收藏为敬
  5. django学习笔记01
  6. 双系统重装windows后修复UBUNTU的GRUB
  7. 【QT】入门基础教程Qt5
  8. MySQL批量插入测试数据
  9. 190825 reverse-ogeek初赛
  10. 计算机三级数据库应用题设计题,计算机考试三级数据库练习题
  11. 技术主管和技术总监的区别_技术主管–责任圈
  12. 概念数据模型(E-R模型)
  13. 垃圾纸盒的叠法-超级实用
  14. CentOS7 ECS使用(慕课网付费课笔记)
  15. 进入 32 位时代,谁能成为下一个8051?
  16. 智优ERP的升级版智优E3_ERP,可以自定义列,和自定义打印公司logo
  17. PHP 农历公历互转,八字排盘,星座,日历,支持从-1000到3000年间的排盘,二十四节气...
  18. uefi装完系统后无法引导_uefi安装win10无法启动?uefi安装win10无法启动原因分析及解决方法...
  19. Spring Cloud Alibaba微服务组件快速上手
  20. C#结合天敏VC4000采集卡视频监控

热门文章

  1. 中基鸿业什么是净值型理财产品
  2. python鸭子类型_1
  3. 高等数学学习笔记——第三讲——函数的概念与性质(1. 函数的概念)
  4. UVa1646 - Edge Case
  5. 【读书笔记】Python网络爬虫从入门到实践(第2版)-唐松,爬虫基础体系巩固和常见场景练习
  6. $http的使用方式
  7. python读取excel画出饼状图_python操作Excel、openpyxl 之图表,折线图、饼图、柱状图等...
  8. OpenCV读取图片和保存图片全黑
  9. 计算机房间墙壁的布置,房间小怎么布置 小房间布置有妙招
  10. Typecho+Handsome主题美化