using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using UniRx;
using HMProject.HoloMon;
using HMProject.HoloMonUtilities;
namespace HMProject.HoloMonCondition
{
<summary>
</summary>
[Serializable]
public class HoloMonBodyStatus
{
<summary>
</summary>
public DateTime BirthTime;
<summary>
</summary>
public int AgeOfDay;
<summary>
</summary>
public float BodyHeight;
<summary>
</summary>
public float DefaultHeight;
}
<summary>
</summary>
[Serializable]
public class HoloMonBodyStatusReactiveProperty : ReactiveProperty<HoloMonBodyStatus>
{
public HoloMonBodyStatusReactiveProperty()
{
}
public HoloMonBodyStatusReactiveProperty(HoloMonBodyStatus a_HoloMonBodyStatus) : base(a_HoloMonBodyStatus)
{
}
}
public class HoloMonConditionBodySingleton : MonoBehaviour
{
<summary>
</summary>
private static HoloMonConditionBodySingleton ps_instance;
<summary>
</summary>
public static HoloMonConditionBodySingleton Instance
{
get
{
if (ps_instance == null && ps_searchForInstance)
{
ps_searchForInstance = false;
var ps_instances = FindObjectsOfType<HoloMonConditionBodySingleton>();
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 HoloMonBodyStatusReactiveProperty p_HoloMonBodyStatus
= new HoloMonBodyStatusReactiveProperty();
<summary>
</summary>
private IReadOnlyReactiveProperty<HoloMonBodyStatus> p_IReadOnlyReactivePropertyHoloMonBodyStatus;
<summary>
</summary>
public IReadOnlyReactiveProperty<HoloMonBodyStatus> IReadOnlyReactivePropertyHoloMonBodyStatus
=> p_IReadOnlyReactivePropertyHoloMonBodyStatus
?? (p_IReadOnlyReactivePropertyHoloMonBodyStatus = p_HoloMonBodyStatus.ToSequentialReadOnlyReactiveProperty());
<summary>
</summary>
IDisposable p_MinuteTimeTrigger;
<summary>
</summary>
<param name="a_BirthTime"></param>
private void ReceptionBirthTime(DateTime a_BirthTime)
{
HoloMonBodyStatus status = p_HoloMonBodyStatus.Value;
if (status.BirthTime != a_BirthTime)
{
status.BirthTime = a_BirthTime;
p_HoloMonBodyStatus.SetValueAndForceNotify(status);
}
}
<summary>
</summary>
<param name="a_AgeOfDay"></param>
private void ReceptionAgeOfDay(int a_AgeOfDay)
{
HoloMonBodyStatus status = p_HoloMonBodyStatus.Value;
if (status.AgeOfDay != a_AgeOfDay)
{
status.AgeOfDay = a_AgeOfDay;
p_HoloMonBodyStatus.SetValueAndForceNotify(status);
}
}
<summary>
</summary>
<param name="a_BodyHeight"></param>
private void ReceptionBodyHeight(float a_BodyHeight)
{
HoloMonBodyStatus status = p_HoloMonBodyStatus.Value;
a_BodyHeight = RoundHeight(a_BodyHeight);
if (status.BodyHeight != a_BodyHeight)
{
status.BodyHeight = a_BodyHeight;
p_HoloMonBodyStatus.SetValueAndForceNotify(status);
}
}
<summary>
</summary>
<param name="a_DefaultHeight"></param>
private void ReceptionDefaultHeight(float a_DefaultHeight)
{
HoloMonBodyStatus status = p_HoloMonBodyStatus.Value;
a_DefaultHeight = RoundHeight(a_DefaultHeight);
if (status.DefaultHeight != a_DefaultHeight)
{
status.DefaultHeight = a_DefaultHeight;
p_HoloMonBodyStatus.SetValueAndForceNotify(status);
}
}
<summary>
</summary>
<param name="a_Height"></param>
public void SetHeight(float a_Height)
{
ReceptionBodyHeight(a_Height);
}
<summary>
</summary>
public void SetHoloMonData(HoloMonSaveData a_SaveData)
{
p_HoloMonBodyStatus.Value = a_SaveData.BodyStatus;
}
<summary>
</summary>
void Start()
{
InitializeBodyStatus();
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 InitializeBodyStatus()
{
ReceptionBirthTime(DateTime.Now);
ReceptionAgeOfDay(0);
ReceptionBodyHeight(0.3f);
ReceptionDefaultHeight(0.3f);
}
<summary>
</summary>
<param name="a_DateTime"></param>
private void ChangeOverTimeCondition(DateTime a_DateTime)
{
Debug.Log("ChangeOverTimeCondition : " + a_DateTime.ToString());
CheckAgeOfDay(a_DateTime);
}
<summary>
</summary>
<param name="a_DataTime"></param>
private void CheckAgeOfDay(DateTime a_DataTime)
{
DateTime BirthTime = p_HoloMonBodyStatus.Value.BirthTime;
int CurrentAgeOfDay = ActivityElapsedDays(BirthTime, a_DataTime);
if (CurrentAgeOfDay != p_HoloMonBodyStatus.Value.AgeOfDay)
{
ReceptionAgeOfDay(CurrentAgeOfDay);
}
}
<summary>
</summary>
<param name="a_StartTime"></param>
<param name="a_EndTime"></param>
<returns></returns>
private int ActivityElapsedDays(DateTime a_StartTime, DateTime a_EndTime)
{
TimeSpan SubtractionTime = a_EndTime - a_StartTime;
int elapsedTotalDays = SubtractionTime.Days;
return elapsedTotalDays;
}
<summary>
</summary>
<returns></returns>
private float RoundHeight(float a_Height)
{
float roundHeight = 0.0f;
if (a_Height < 1.0f)
{
roundHeight = (float)Math.Round(a_Height, 2, MidpointRounding.AwayFromZero);
}
else
{
if(a_Height < 10.0f)
{
roundHeight = (float)Math.Round(a_Height, 1, MidpointRounding.AwayFromZero);
}
else
{
roundHeight = (float)Math.Round(a_Height, MidpointRounding.AwayFromZero);
}
}
return roundHeight;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UniRx;
using HMProject.HoloMonCondition;
namespace HMProject.Item
{
public class ItemFoodController : MonoBehaviour
{
<summary>
</summary>
[SerializeField, Tooltip("コントロール対象")]
private GameObject p_ControlObject;
<summary>
</summary>
[SerializeField, Tooltip("投擲基準位置")]
private Transform p_ThrowPosition;
<summary>
</summary>
[SerializeField, Tooltip("NavMesh追跡ポイント")]
private Transform p_NavMeshTrackingPoint;
<summary>
</summary>
[SerializeField, Tooltip("デフォルト座標")]
private Vector3 p_DefaultWorldPosition;
<summary>
</summary>
[SerializeField, Tooltip("デフォルトサイズ")]
private Vector3 p_DefaultLocalScale;
<summary>
</summary>
[SerializeField, Tooltip("投擲時イベント")]
private UnityEvent p_ThrowKickEvent;
<summary>
</summary>
void Start()
{
p_DefaultWorldPosition = p_ControlObject.transform.position;
p_DefaultLocalScale = p_ControlObject.transform.localScale;
p_ControlObject.SetActive(false);
HoloMonConditionBodySingleton.Instance.IReadOnlyReactivePropertyHoloMonBodyStatus
.ObserveOnMainThread()
.Subscribe(status => {
ApplySizeCondition(status.DefaultHeight, status.BodyHeight);
})
.AddTo(this);
}
<summary>
</summary>
void Update()
{
}
<summary>
</summary>
public void ResetObject()
{
p_ControlObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
p_ControlObject.transform.position = p_DefaultWorldPosition;
p_ControlObject.SetActive(false);
}
<summary>
</summary>
public void ThrowObject()
{
p_ControlObject.SetActive(true);
p_ControlObject.transform.position = p_ThrowPosition.position + (p_ThrowPosition.up * 0.2f);
Vector3 forward = p_ThrowPosition.forward * 100.0f;
p_ControlObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
p_ControlObject.GetComponent<Rigidbody>().AddForce(forward);
p_ThrowKickEvent.Invoke();
}
<summary>
</summary>
<param name="a_DefaultHoloMonHeight"></param>
<param name="a_CurrentHoloMonHeight"></param>
private void ApplySizeCondition(float a_DefaultHoloMonHeight, float a_CurrentHoloMonHeight)
{
float ratioHeight = a_CurrentHoloMonHeight / a_DefaultHoloMonHeight;
p_ControlObject.transform.localScale = p_DefaultLocalScale * ratioHeight;
}
}
}