【Unity ライブラリ】Easy Save 2 : DateTime型のデータを保存

EasySave2でDateTime型は保存できないので、string型で保存する。

public string _sCurTimeIsLeft{
	get{
		if (ES2.Exists ("curTimeIsLeft" + _id)) {
			return ES2.Load<string> ("curTimeIsLeft" + _id);
		} else {
			return null;
		}
	}
	set{
		ES2.Save (value, "curTimeIsLeft" +  _id);
	}
}
public string _sTimeIsClicked{
	get{
		if (ES2.Exists ("timeIsClicked" + _id)) {
			return ES2.Load<string> ("timeIsClicked" + _id);
		} else {
			return null;
		}
	}
	set{
		ES2.Save (value, "timeIsClicked" +  _id);
	}
}

呼び出す側で、intやDateTime型に変換してあげる。

void Update () {
	if(SkillSource._item[_id]._bOnUseSkill){
		if( _curTimeIsLeft > 0){
			_curTimeIsLeft 		= Convert.ToInt64(SkillSource._item[_id]._sCurTimeIsLeft);
			TimeSpan pastTime 	= DateTime.Now  -  Convert.ToDateTime(SkillSource._item[_id]._sTimeIsClicked);
			_curTimeIsLeft 		= _timeCoolDown - pastTime.Seconds;

			SkillSource._item[_id]._sCurTimeIsLeft = Convert.ToString(_curTimeIsLeft);
			
			UpdateContent();
		}else{
			SkillSource._item[_id]._bOnUseSkill = false;
			_curTimeIsLeft 		= _timeCoolDown;
			_bIcon.enabled 		= true;
		}
	}
}

public void SetContent(int id)
{
	List<SkillContents> _item =  SkillSource._item;
	_id 			  = id;
	_type			  = _item[_id]._type;
	_curLevel 		  = _item[_id]._curLevel;
	_levelRequirement = _item[_id]._stageRequirement;
	_iSkill.SetSprite ( _item[_id]._spriteName);
	Utility.ChangeTextMesh(_tName		, _item[_id]._name);
	Utility.ChangeTextMesh(_tDescription, _item[_id]._description);

	UpdateContent(_id);
}

【Unity エラー】Inspecterでnullスクリプトがないか確認する

NullReferenceException: Object reference not set to an instance of an object
<原因>
Inspecterで、null(指定していない)スクリプトをコンポーネントに持つオブジェクトが存在する。

NullReferenceException: Object reference not set to an instance of an object
UnityEngine.UI.Graphic.OnRebuildRequested () (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Graphic.cs:454)
UnityEngine.UI.GraphicRebuildTracker.OnRebuildRequested () (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/GraphicRebuildTracker.cs:33)
UnityEngine.CanvasRenderer.RequestRefresh ()

answers.unity3d.com
answers.unity3d.com

アニメーションのプレイ "Animator.Play("stateName", layer, startFrame);"

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class AchievementNotif : MonoBehaviour {
	public AchievementContentNotif _achievementContentNotif;

	public Animator _animNotif;
	#region Event
	void OnEnable(){
		EventAchievementManager.onAchievementE += ShowNotif;
	}
	void OnDisable(){
		EventAchievementManager.onAchievementE -= ShowNotif;		
	}
	#endregion
	void ShowNotif (int i) {

		List<AchievementContents> _myCollection =  AchievementSource._instance._myCollection;
		_achievementContentNotif.SetContent(_myCollection[i]._name, 
		                                    _myCollection[i]._type, 
		                                    _myCollection[i]._goal);

		_animNotif.Play("PopNotif" , -1 , 0f);

	}

}

qiita.com

【C#】Delegate使用 Event 使用例 第三弾

EventManagerでイベントの起点を束ねる。
1. 全てのイベントを管理するEventManager
2. Eventの起点
3. どんなEventを呼ぶかを記述


1. 全てのイベントを管理するEventManager
EventManager.cs

using UnityEngine;
using System.Collections;

public class EventManager {

	public delegate void GameChangeScene(GameController.GAME_SCENE scene);
	public static event GameChangeScene onGameChangeSceneEvent;
	public static void GameChangeSceneMethod(GameController.GAME_SCENE scene) { 	if (onGameChangeSceneEvent != null) onGameChangeSceneEvent(scene); }
}

2. Eventの起点
ボスが殺された時にshareUIを呼ぶ。
EnemyManager.cs

	void HandleonBossKilledEvent (){
		EventManager.GameChangeSceneMethod (GameController.GAME_SCENE.GAME_SCENE_SHARE);
		_wave =0;
		_maxWave = 10;
		GameController._stage++;
		GameDataManager.SaveStage(GameController._stage);
		EventManager.ChangeStageMethod();
		DisableBossMode ();
		SpawnEnemies ();

	}

3. どんなEventを呼ぶかを記述
ShareUIを表示する
UIShare.cs

	void OnEnable(){
		EventManager.onGameChangeSceneEvent += HandleonGameChangeSceneEvent;
	}
	void OnDisable(){
		EventManager.onGameChangeSceneEvent -= HandleonGameChangeSceneEvent;
	}
	void HandleonGameChangeSceneEvent (GameController.GAME_SCENE scene)
	{
		switch (scene) {
		case GameController.GAME_SCENE.GAME_SCENE_SHARE:
		
			_container.SetActive(true);
			_anim.Play ("PaperNewsFlashEntrance", -1, 0f);
			AudioManager.Instance.PlaySound("sfxNewsFlash");
			break;
		default:
			_container.SetActive(false);
			break;
		}
	}

【Unity】enum列挙型に関して

1. "string型(文字列型)"から"enum列挙型"ヘのキャスト

	private List<AchievementContents> LoadAbilityTableFromJSON(string json){
		JsonData jresult = JsonMapper.ToObject (json);
		List<AchievementContents> data = new List<AchievementContents> ();
		
		for(int i=0;i<jresult.Count;i++){
			data.Add(new AchievementContents(){
				_id = (int)jresult[i]["Id"],
				_name = (string)jresult[i]["Name"],
				_type =  (AchievementManager.ACHIEVEMEN_TYPE)Enum.Parse(typeof(AchievementManager.ACHIEVEMEN_TYPE), (string)jresult[i]["Type"]),
				_goal = (string)jresult[i]["Goal"],
				_rewardType = (string)jresult[i]["Reward Type"],
				_reward = (string)jresult[i]["Reward"],
			});

		}
		return data;
	}

数値や文字列を列挙体に変換する: .NET Tips: C#, VB.NET


2. "int型"から"enum列挙型"ヘのキャスト

using UnityEngine;
using System.Collections;

public class AngelManager : MonoBehaviour {


	public GameObject _gVideoAdsNotif;
	public enum ANGEL_BONUS_TYPE
	{
		ANGEL_BONUS_VIDEOADS 				= 0,
		ANGEL_BONUS_COIN				= 1,
		ANGEL_BONUS_SKILL_BAYANGAN			= 2,
	}
	
	void OnEnable()
	{
		EventManager.onCoinBonusClickEvent += HandleonAngelClickEvent;
	}	
	void OnDisable()
	{
		EventManager.onCoinBonusClickEvent -= HandleonAngelClickEvent;
	}

	private void HandleonAngelClickEvent()
	{
		int type = Random.Range(0, System.Enum.GetNames(typeof(ANGEL_BONUS_TYPE)).Length);


		switch((ANGEL_BONUS_TYPE)type){
		case ANGEL_BONUS_TYPE.ANGEL_BONUS_VIDEOADS:
			break;
		case ANGEL_BONUS_TYPE.ANGEL_BONUS_COIN:
			break;
		case ANGEL_BONUS_TYPE.ANGEL_BONUS_SKILL_BAYANGAN:
			break;
		}
	}
}


3. "enum列挙型"の数を数える

var AchievementTypeArray = System.Enum.GetNames(typeof(AchievementManager.ACHIEVEMEN_TYPE)).Length;

My C# script give me an error? - Unity Answers
列挙型と数値or文字列との相互変換や項目数の取得など【C#】 - (:3[kanのメモ帳]
enumの項目数を取得する - Qiita