using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UniRx;
namespace HMProject.HoloMonCondition
{
<summary>
</summary>
[Serializable]
public struct HoloMonLifeStatus
{
<summary>
</summary>
public DateTime HungryChangeTime;
<summary>
</summary>
public int HungryPercent;
<summary>
</summary>
public DateTime MoodChangeTime;
<summary>
</summary>
public int MoodPercent;
<summary>
</summary>
public DateTime SleepinessChangeTime;
<summary>
</summary>
public HoloMonSleepinessLevel SleepinessLevel;
}
<summary>
</summary>
[Serializable]
public class HoloMonHungrySetting
{
<summary>
</summary>
public int DecreasePoint;
<summary>
</summary>
public int DecreaseMarginMinute;
public HoloMonHungrySetting()
{
DecreasePoint = 1;
DecreaseMarginMinute = 10;
}
}
<summary>
</summary>
[Serializable]
public class HoloMonMoodSetting
{
<summary>
</summary>
public int DecreasePoint;
<summary>
</summary>
public int DecreaseMarginMinute;
public HoloMonMoodSetting()
{
DecreasePoint = 2;
DecreaseMarginMinute = 1;
}
}
<summary>
</summary>
[Serializable]
public class HoloMonSleepSetting
{
<summary>
</summary>
public TimeSpan StartTime;
<summary>
</summary>
public TimeSpan EndTime;
public HoloMonSleepSetting()
{
StartTime = new TimeSpan(22, 0, 0);
EndTime = new TimeSpan(6, 0, 0);
}
}
<summary>
</summary>
public enum HoloMonSleepinessLevel
{
Nothing = 0,
Little = 1,
Sleepy = 2
}
<summary>
</summary>
[Serializable]
public class HoloMonLifeStatusReactiveProperty : ReactiveProperty<HoloMonLifeStatus>
{
public HoloMonLifeStatusReactiveProperty()
{
}
public HoloMonLifeStatusReactiveProperty(HoloMonLifeStatus a_HoloMonLifeStatus) : base(a_HoloMonLifeStatus)
{
}
}
public class HoloMonConditionLifeSingleton : MonoBehaviour
{
<summary>
</summary>
private static HoloMonConditionLifeSingleton ps_instance;
<summary>
</summary>
public static HoloMonConditionLifeSingleton Instance
{
get
{
if (ps_instance == null && ps_searchForInstance)
{
ps_searchForInstance = false;
var ps_instances = FindObjectsOfType<HoloMonConditionLifeSingleton>();
if (ps_instances.Length == 1)
{
ps_instance = ps_instances[0];
}
else if (ps_instances.Length > 1)
{
Debug.LogErrorFormat("Expected exactly 1 {0} but found {1}.", ps_instance.GetType().ToString(), ps_instances.Length);
}
}
return ps_instance;
}
}
private static bool ps_searchForInstance = true;
<summary>
</summary>
[SerializeField, Tooltip("ホロモンのライフコンディション")]
private HoloMonLifeStatusReactiveProperty p_HoloMonLifeStatus
= new HoloMonLifeStatusReactiveProperty();
<summary>
</summary>
private IReadOnlyReactiveProperty<HoloMonLifeStatus> p_IReadOnlyReactivePropertyHoloMonLifeStatus;
<summary>
</summary>
public IReadOnlyReactiveProperty<HoloMonLifeStatus> IReadOnlyReactivePropertyHoloMonLifeStatus
=> p_IReadOnlyReactivePropertyHoloMonLifeStatus
?? (p_IReadOnlyReactivePropertyHoloMonLifeStatus = p_HoloMonLifeStatus.ToReadOnlyReactiveProperty());
<summary>
</summary>
[SerializeField, Tooltip("ホロモンの空腹設定")]
private HoloMonHungrySetting p_HoloMonHungrySetting = new HoloMonHungrySetting();
<summary>
</summary>
[SerializeField, Tooltip("ホロモンの機嫌設定")]
private HoloMonMoodSetting p_HoloMonMoodSetting = new HoloMonMoodSetting();
<summary>
</summary>
[SerializeField, Tooltip("ホロモンの睡眠設定")]
private HoloMonSleepSetting p_HoloMonSleepSetting = new HoloMonSleepSetting();
<summary>
</summary>
IDisposable p_MinuteTimeTrigger;
<summary>
</summary>
<param name="a_HungryPercent"></param>
private void ReceptionHungryPercent(int a_HungryPercent)
{
HoloMonLifeStatus status = p_HoloMonLifeStatus.Value;
if (status.HungryPercent != a_HungryPercent)
{
status.HungryPercent = a_HungryPercent;
status.HungryChangeTime = DateTime.Now;
p_HoloMonLifeStatus.Value = status;
}
}
<summary>
</summary>
<param name="a_MoodPercent"></param>
private void ReceptionMoodPercent(int a_MoodPercent)
{
HoloMonLifeStatus status = p_HoloMonLifeStatus.Value;
if (status.MoodPercent != a_MoodPercent)
{
status.MoodPercent = a_MoodPercent;
status.MoodChangeTime = DateTime.Now;
p_HoloMonLifeStatus.Value = status;
}
}
<summary>
</summary>
<param name="a_Sleepiness"></param>
private void ReceptionSleepiness(HoloMonSleepinessLevel a_Sleepiness)
{
HoloMonLifeStatus status = p_HoloMonLifeStatus.Value;
if (status.SleepinessLevel != a_Sleepiness)
{
status.SleepinessLevel = a_Sleepiness;
status.SleepinessChangeTime = DateTime.Now;
p_HoloMonLifeStatus.Value = status;
}
}
<summary>
</summary>
void Start()
{
InitializeLifeStatus();
p_MinuteTimeTrigger = Observable
.Timer(TimeSpan.FromSeconds(60.0f - DateTime.Now.Second), TimeSpan.FromMinutes(1.0f))
.SubscribeOnMainThread()
.Subscribe(x => {
ChangeOverTimeCondition(DateTime.Now);
})
.AddTo(this);
}
<summary>
</summary>
void Update()
{
}
<summary>
</summary>
private void InitializeLifeStatus()
{
ReceptionHungryPercent(50);
ReceptionMoodPercent(50);
ReceptionSleepiness(HoloMonSleepinessLevel.Nothing);
}
<summary>
</summary>
<param name="a_DateTime"></param>
private void ChangeOverTimeCondition(DateTime a_DateTime)
{
Debug.Log("ChangeOverTimeCondition : " + a_DateTime.ToString());
CheckHungry(a_DateTime);
CheckMood(a_DateTime);
CheckSleepTime(a_DateTime);
}
<summary>
</summary>
<param name="a_StartTime"></param>
<param name="a_EndTime"></param>
<returns></returns>
public int ActivityElapsedMinutes(DateTime a_StartTime, DateTime a_EndTime)
{
double doubleElapsedTotalMinutes = 0.0f;
if (IsSleepTime(a_StartTime))
{
a_StartTime = new DateTime(
a_StartTime.Year,
a_StartTime.Month,
a_StartTime.Day,
p_HoloMonSleepSetting.EndTime.Hours,
p_HoloMonSleepSetting.EndTime.Minutes,
p_HoloMonSleepSetting.EndTime.Seconds
);
}
if (IsSleepTime(a_StartTime))
{
a_EndTime = new DateTime(
a_EndTime.Year,
a_EndTime.Month,
a_EndTime.Day,
p_HoloMonSleepSetting.StartTime.Hours,
p_HoloMonSleepSetting.StartTime.Minutes,
p_HoloMonSleepSetting.StartTime.Seconds
);
}
TimeSpan SubtractionTime = a_EndTime - a_StartTime;
doubleElapsedTotalMinutes = SubtractionTime.TotalMinutes;
if (doubleElapsedTotalMinutes > 0.0f)
{
int sleepMinutes = SubtractionTime.Days * TotalSleepMinutes();
doubleElapsedTotalMinutes -= sleepMinutes;
}
else
{
doubleElapsedTotalMinutes = 0.0f;
}
int elapsedTotalMinutes = (int)Math.Round(doubleElapsedTotalMinutes);
return elapsedTotalMinutes;
}
<summary>
</summary>
<param name="a_DataTime"></param>
private void CheckHungry(DateTime a_DataTime)
{
DateTime changeTime = p_HoloMonLifeStatus.Value.HungryChangeTime;
int elapsedTotalMinutes = ActivityElapsedMinutes(changeTime, a_DataTime);
int decreseCoefficient = elapsedTotalMinutes / p_HoloMonHungrySetting.DecreaseMarginMinute;
int totalDecreasePoint = decreseCoefficient * p_HoloMonHungrySetting.DecreasePoint;
int hungryPercent = p_HoloMonLifeStatus.Value.HungryPercent - totalDecreasePoint;
ReceptionHungryPercent(hungryPercent);
}
<summary>
</summary>
<param name="a_DataTime"></param>
private void CheckMood(DateTime a_DataTime)
{
DateTime changeTime = p_HoloMonLifeStatus.Value.MoodChangeTime;
int elapsedTotalMinutes = ActivityElapsedMinutes(changeTime, a_DataTime);
int decreseCoefficient = elapsedTotalMinutes / p_HoloMonMoodSetting.DecreaseMarginMinute;
int totalDecreasePoint = decreseCoefficient * p_HoloMonMoodSetting.DecreasePoint;
int moodPercent = p_HoloMonLifeStatus.Value.MoodPercent - totalDecreasePoint;
ReceptionMoodPercent(moodPercent);
}
<summary>
</summary>
<param name="a_DataTime"></param>
private void CheckSleepTime(DateTime a_DataTime)
{
if(IsSleepTime(a_DataTime))
{
ReceptionSleepiness(HoloMonSleepinessLevel.Sleepy);
}
else
{
ReceptionSleepiness(HoloMonSleepinessLevel.Nothing);
}
}
<summary>
</summary>
<param name="a_DataTime"></param>
private bool IsSleepTime(DateTime a_DataTime)
{
bool isSleepTime = false;
TimeSpan timeOfDay = a_DataTime.TimeOfDay;
if (p_HoloMonSleepSetting.StartTime > p_HoloMonSleepSetting.EndTime)
{
if ((p_HoloMonSleepSetting.StartTime <= timeOfDay) && (timeOfDay <= p_HoloMonSleepSetting.EndTime))
{
isSleepTime = true;
}
else
{
isSleepTime = false;
}
}
else
{
if (((new TimeSpan(0, 0, 0) <= timeOfDay) && (timeOfDay <= p_HoloMonSleepSetting.EndTime)) ||
((p_HoloMonSleepSetting.StartTime <= timeOfDay) && (timeOfDay <= new TimeSpan(23, 59, 59))))
{
isSleepTime = true;
}
else
{
isSleepTime = false;
}
}
return isSleepTime;
}
<summary>
</summary>
private int TotalSleepMinutes()
{
double doubleTotalSleepMinutes = 0.0f;
if (p_HoloMonSleepSetting.StartTime > p_HoloMonSleepSetting.EndTime)
{
TimeSpan AmTotalSleepTime = p_HoloMonSleepSetting.EndTime - new TimeSpan(0, 0, 0);
doubleTotalSleepMinutes += AmTotalSleepTime.TotalMinutes;
TimeSpan PmTotalSleepTime = new TimeSpan(23, 59, 59) - p_HoloMonSleepSetting.StartTime;
doubleTotalSleepMinutes += PmTotalSleepTime.TotalMinutes;
}
else
{
TimeSpan TotalSleepTime = p_HoloMonSleepSetting.EndTime - p_HoloMonSleepSetting.StartTime;
doubleTotalSleepMinutes += TotalSleepTime.TotalMinutes;
}
int totalSleepMinutes = (int)Math.Round(doubleTotalSleepMinutes);
return totalSleepMinutes;
}
}
}