Unity Custom Inspector Value Saving

 • 

最近发现 SetDirty 不太好用,总是没办法让自定义 Inspector 里面的值序列化。然后在
https://docs.unity3d.com/ScriptReference/EditorUtility.SetDirty.html 这里发现有一段话:

NOTE: ''Prior to Unity 5.3, this was the primary method of marking objects as dirty. From 5.3 onwards, with the introduction of Multi-Scene Editing, this function should no-longer be used for modifying objects in scenes. Instead, you should use Undo.RecordObject prior to making changes to the object. This will mark the object's scene as dirty and provide an undo entry in the editor.''

看了下 Undo.RecordObject 的文档,唯一的不好是 EditorGUI.BeginChangeCheck() 和 EditorGUI.EndChangeCheck() 需要一前一后,对于继承的自定义 Custom Editor 有些难办,因此用 Action 把代码变成一个 Code Block:

Helper Code

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
#if UNITY_EDITOR

using UnityEditor;
using UnityEditor.SceneManagement;
 
namespace FinGameWorksEditor.Helper
{
	public static class FGWEditorUtility
	{	
		/// <summary>
		/// Helper Function to use the Undo In Custom Inspector
		/// </summary>
		/// <param name="guiCode">code block to write editorguilayout stuff</param>
		/// <param name="targetCode">code block to write updating target variable stuff</param>
		/// <param name="target">the target monobehavior</param>
		public static void RecordUndoBlock(Action guiCode,Action targetCode,UnityEngine.Object target)
		{
			EditorGUI.BeginChangeCheck();
			guiCode();
			if (EditorGUI.EndChangeCheck())
			{
				Undo.RecordObject(target, "Changed");
				targetCode();
			}
		}
	}
}
#endif

Usage Example

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.SceneManagement;
using FinGameWorks.Helper;

#if UNITY_EDITOR
using UnityEditor;
using FinGameWorksEditor;
using FinGameWorksEditor.Helper;
using FinGameWorks.Controller.SceneManagement;

namespace FinGameWorksEditor.Controller.SceneManagement
{
    [CustomEditor(typeof(FGWSceneLoader), true)]
    public class FGWSceneLoaderEditor : FGWMonobehaviorEditorBase
    {
        public List<string> scenesInBuild
        {
            get
            {
                if (_scenesInBuild == null)
                {
                    _scenesInBuild = FGWSceneHelper.getAllSceneNameInBuild();
                }
                return FGWSceneHelper.getAllSceneNameInBuild();;
            }
        }
        private List<string> _scenesInBuild;

        public FGWSceneLoader loader
        {
            get { return (FGWSceneLoader)target; }
        }

        public override void OnInspectorGUI()
        {
	        base.OnInspectorGUI();
	        bool loadSceneOnStart = false;
	        int sceneIndexToLoad = 0;
	        FGWEditorUtility.RecordUndoBlock(()=>
	        {
	        	GUILayout.Label("Parameters",EditorStyles.boldLabel);
		        loadSceneOnStart = EditorGUILayout.Toggle("Load Scene On Start", loader.loadSceneOnStart);
		        sceneIndexToLoad = EditorGUILayout.Popup("Scene To Set",loader.sceneIndexToLoad,scenesInBuild.ToArray());
		        
		        GUILayout.Label("Action",EditorStyles.boldLabel);
		        if (GUILayout.Button("Refresh Scene List"))
		        {
			        _scenesInBuild = null;
			        foreach (var item in scenesInBuild)
			        {
				        Debug.Log(item);
			        }
		        }
	        },
	        ()=>{
	        	loader.loadSceneOnStart = loadSceneOnStart;
		        loader.sceneIndexToLoad = sceneIndexToLoad;
	        },loader);
        }
    }

}


#endif

namespace FinGameWorks.Controller.SceneManagement
{
    public class FGWSceneLoader : MonoBehaviour
	{
		public bool loadSceneOnStart;
        public int sceneIndexToLoad;

        void Start ()
        {
            if (loadSceneOnStart)
            {
                SceneManager.LoadScene(sceneIndexToLoad);
            }
        }

        void Update () {

        }
    }
}

Epoch Dev Blog 8

 • 

事务繁忙,从去年十月份就没怎么再动过。不过最近把 Epoch 升级到了 Unity 5.6,现在 build 了一个 WebGL 的版本,如果有兴趣的同学可以去玩下。
点这里进入 WebPlayer (Hosted on itch.io)

操作:目前的操作是主要面向手机的,网页版或许会比较难以控制。网页加载完成后,鼠标按住上下滑动可以加减速。操控由左下角的摇杆控制。若提示内存不足,请刷新浏览器。推荐电脑端 Chrome。目前 macOS 10.12 + Chrome 57.0.2987.133 (64-bit) 上测试通过。

Fun Fact:目前 Epoch 在手机上的编译大小只有 60 MB,其中一大半都是飞船的贴图和模型 —— 星球部分只有代码,贴图和模型完全是实时生成。

2017.4.10

 • 
女朋友&吃吃喝喝

妹子来北京找我玩。带着妹子见了一些互联网圈子里的朋友和同事。两个人前半段时间在外面吃吃喝喝看电影逛街,后半段就主要窝在家里。中间尝试在家里继续写 Cetacea For Mac,妹子颇有兴趣地看了会,然后就困了。所以就在一起用电脑看 YouTube 和 Bilibili。

Cetacea For Mac

重构了一部分,也加了一部分功能。highlight.js 的基本嵌入工作完成,因此 Preview Panel 的功能趋于可用。Markdown Parser 的正则仍在修改,也在尝试实现一套 Incremental Parser。除此以外,主题功能也在逐步更新中,目前的效果如图。

WWDC Scholarship 2017

我的 Swift Playground 叫 Golf GO。Golf GO 是一个使用了 SceneKit,ModelIO,GamePlayKit 的地图过程生成的高尔夫球游戏。写 WWDC 奖学金申请的体会是 Swift Playground 并不是一个“严肃”的编程平台,包括如果不通过设置 plist 就不能关掉 logging,所有类都要写在一个文件里,各种放在 Single Page Application 模板里运行没问题的代码会在 Playground 里无故出错。除此以外,我也再也不想写 Swift 了。

WebDrop

更新了一个版本:1.0.1,Related Issue:WebDrop/issues/2

电影&音乐

看了攻壳机动队美女和野兽,听了 The Wheel by SOHN

2017.3.30

 • 

三月就快结束了的样子。
辅导员中间让我回学校开会。我在北京自是没办法赶回去。谦哥帮我打了电话给辅导员,但结果也不是很理想。
有趣的是辅导员开了一个就业群,在里面发一些小公司的实习信息。就发布的消息来说,自是我看不上的。有趣的地方就在这里,真正的 BAT 大厂实习,肯定是不会在长沙的,学院拦着不让去。却在学院内部搞什么简历大赛,就业宣讲会,就业自我评测,发一些长沙本地小公司的实习消息,着实让人有一种眼界狭隘的感觉。
我对这个学校,在一点点的摩擦中,算是一点好感都没有了。我妈总是觉得我此话太过,不过我自己的考虑是,第一,如果不在这个学校学计算机,我目前的发展有很大可能会变的更好。第二,我没有拒绝已经进入这个学校的事实,我自己当初选的学校,我可以说后悔,但我绝没有不承认事实,也绝没有自暴自弃,相反我还在积极地通过自己的方式去解决在一个落后的学校里让自己更好地发展的问题。第三,在此基础上,我觉得我算是做到应有的份上了。我不会因为在某个学校就把自己限制在这个学校的羸弱水平上,不会因为学院里的一两句话把自己宝贵的几年浪费掉。我通过自己的一些努力在北京实习,保证自己毕业后立马能转正,职业路途上没靠过一次学校的名声和好处,也不需要别人关照我的毕业去向,这个时候我说一句对学校没什么好感,似乎也没什么问题。还是那句话,我自己做了选择,不管结果好坏,我带着结果继续在埋头苦干,没有逃避,别人还能要求什么呢。

2017.3.25

 • 
天气

北京又开始降温。长沙忽冷忽热能连续两周下雨的天气,我在那快三年来没怎么感冒过,反而在北京的第一个月就感冒了。早上醒来喉咙还有些疼,空气也不是那么好,我是个容易过敏的人,走在路上也总觉得痒痒的。

工作

上一篇说过入职百度前发生了一件事情搞得大家都不愉快。我还在学校的时候发了些消息说想找北京/杭州的实习,后面陆陆续续也聊了很多公司。然后我在入职的那天需要选择究竟是入职百度实习生还是小米实习生。当然选择公司当然不是看起来那么简单,因为两边都有朋友,去哪家另一家的人都会失望吧,即使嘴上说着“你选工作是看你自己未来的”。
目前是跟着之前的公司一起入职了百度。

目前在智能硬件部门的工作也不是很顺利。前司在合并入大厂后,整个工作流还是像之前一样随性,我心目中大厂应该有的单元测试,自动化构建,文档什么的都没有。我觉得最不爽的就是文档这件事情,前年八月底算是要回学校,赶着最后几天做了一套简单的 Unity 内调用 Doxygen 的文档生成系统,把内部项目的脚本大致都标注了下,为此还错过了当时的 Sketch Meetup。然后我回到学校上大三上学期,等寒假后我回来发现文档基本没人读,这个我倒无所谓,但没人更新新写的代码的文档对我要重构的任务来说就很困难了。整个项目中在我上学的时候改了很多 API,作为一个在 Android 上以一个 Activity 存在的 Unity 项目,某些 Native 接口又不是那么好调试,没办法通过调接口来快速明白接口是干什么的,没了文档更是什么都不知道。我只能去问之前负责的一些人,但回答要么很模糊要么就很不耐烦,最后还要因为某些指向不明的接口争执一番。
上周末在公司加班想着重构能 20 号结束,然后我有些空闲时间给 WWDC 奖学金写东西。毕竟去年的 WWDC 奖学金就是因为在渡鸦做 Gear VR 耽误了,今年不能再因为同一家公司耽误这事,明年大四了就准备毕业设计哪还有时间去投奖学金。
然后我明白了只要我不问清楚整个项目每一个代码究竟是干什么用的,这个重构的事情恐怕就是 WWDC 奖学金审核结束了都不一定能完。总会有 API 表现和预期不一样,问之前的 Unity 负责人说是这个时候会被 Android 触发,然后跑在机器上也不一样,问 Android 负责人给的是另一套行为逻辑。讲真我已经受够也没什么热情重构这个项目了,毕竟除了自己会更新文档也没人会去,最后这些代码有没有意义也不清楚,谁都不希望自己写的东西到后面没人用,简历上怎么写都很尴尬。

其他

本周(及上周)面了很多人,包括 XHackertxxFrad Lee羽喵丁一紫米房老板
每日通勤听 Spotify。最近听了 Firing Line -Original Mix
by JackLNDN
/ Vanessa's Tune
by Chris McClenney

2017.3.17

 • 

因为前司之前被收购的原因,去百度入了职。现在算是百度实习生。入职前后还发生了一些事情,搞得大家都不愉快,就不细说了。
前司迁入百度后保留办公地点和大部分人员。我继续做重构。重构大致要做的事情我是这么和妹子比喻的:房主原本有一层楼,然后房主又买下了这栋楼的另一层,让我去把这两层的电路改造为一整套,我就在这两层之间辗转挪移,把两层的接线板都拆下,取而代之一套可以同时控制两层楼的电路系统,这期间还要保证大部分的电路运转正常。
因为重构的原因,个人项目无一继续推进。准备给今年 WWDC Scholarship 写一个 Playground 来着。
阿里的电面回答的不是很好,一个是自己算法的部分比较渣,一个是在介绍项目经验时泛泛而谈,最后还用电脑写了道题,也是磕磕碰碰。
电影看了最终幻想 15,金刚狼 3,和一条狗的使命。

2017.3.07

 • 

算起来在北京也过了一周多了。
在二十岁生日当天签了租房的合同。房租在城的东边,地铁加单车去东大桥上班要五十分钟左右,加上地铁日常偏挤一些,到公司只能说不算轻松。
但好处是整租,整间房子都是自己的,洗澡啊做饭啊都比较自由。以及房子是 Loft,房高接近 4m,带一个同样高度的大落地窗。每次从落地窗看到飞过的飞机心情都会变好一点。
工作上的事情推的比较慢,因为目前大致在做一个重构的事情。以及多了件难以抉择的事情,以我总是不会拒绝的性格觉得很棘手,同时也拖累了很多人,希望以后能果断些。
不管怎么说,总算是有点正常生活的样子了。


之前找人推了杭州某大厂。上周某天找电工在新家修电路,一片漆黑中我帮忙开手电筒照明,电工说这个不能碰那个不能碰气氛还有些紧张。突然来了杭州的电话说面试,问我有没有时间,我说现在没。然后那边说那等下次吧。然后到现在校招就处于迷一样的状态,我感觉我应该已经挂了,现在想起来感觉自己像一个智障一样,虽然说起来挺好笑的,还被周围的人吐槽和(善意地)取笑了好几次。


周末和母上聊天,聊到为什么我对挣钱这件事情这么有执念。
原因大概是在初中的时候父母想要我去一个成绩较好的军事化管理的学校,因此被扔进一个不熟的圈子,而小孩子总是喜欢抱团敌视圈子外的人的。为了混进圈子,当时的我在言语中尽力淡化自己作为外来者的特殊性,甚至以贬低自己和学习他人粗鄙的习性来融入集体。在不知不觉的自我暗示中,我开始真的变得不自信起来。因此后来的我总是想竭力证明自己来获得自信,其中就包括挣钱。
如果不是这段经历,我或许不会如此着急而病态地想证明自己,而有一个相对正常的心态。但也正是这段经历,让我真正对自己想要什么有了些启蒙。可以说我是会一直带着这段经历的影响继续下去,我没办法不承认这段经历,因为那意味着我这几年做的事情近乎无意义。
总会有嗤之以鼻的人,我也无意争论。快淹死的人是不会和岸上旁观的人争论游泳的方法对不对的,即使这个人后来侥幸游上了岸。

20.

 • 

我一直对省钱没有什么概念,因此逛超市会一直感到好奇,为什么会有十九块九毛九这种啰嗦又会找一堆零钱的定价方式。等到我变大后开始不断花钱,才算明白了这种明摆着二十却能让人觉得只有十几块的定价套路。
后来开始准备简历,实习,拿工资,像是被贴了超市的价格标签一样被扔到茫茫程序员堆里,终于也到了要被套路的年龄了。十九岁永远是十几岁,而二十岁说出来就是二十几岁了,说起来对自己的冲击力可能更大一些,无力感也会更强一些。

究竟自己价值几何,能卖出去多少的价格,又希望生产什么样的价值。19 岁的后半年里我其实一直在想这几个问题。谈薪资的时候,会有一种虚晃的不真实感,因为父母辈在小城市的事业单位里,兢兢业业,而我第一份实习的工资就差不多是父母两人工资加起来的总和。但再往后看,实习的工资面对大城市租房又不堪一击,想达到和父辈同等买房发车的愿景又不现实起来。如此只能再去期望拿到更高的工资。
尚好的是我足够幸运,处于一个自身喜欢的事业里面。如此,很多挣钱和追求理想之间的冲突简化了起来,因此我过的非常满足。

2017.2.26

 • 

开学的第一周过去了。
讲了中南 iOS 实验室最后一节开发课,和 NodeX 内部吃了一两顿饭。大致确定了下学期的实习公司和薪资,收拾了行李寄到公司。飞去杭州见妹子,连看了两场电影,绕着西湖走了好多路,聊了好多事情。面基了 Luv Letter,然后火车去北京。


在火车上看书。挪威的森林里如是写道:

我折回自己房间,解下领带,把上衣裤子挂在衣架上,换上睡衣,刷牙漱口。随即想起:得得,明天又是星期天。我觉得简直就像每隔四天就来一个星期天。再过两个星期天,我将满20岁。我歪倒在床上,望着墙上的挂历,不觉黯然神伤。

2017.02.16

 • 

聊了几个工作机会,大致的感觉是大公司对于实习都还是按照流程来,无论是快速入职还是定工资都没有多少余地。长沙本地公司不是很多(而且我也没打算在长沙找),而很多北上广公司的实习是提供给当地有宿舍的学生的,按天算的工资不是太高,若是像我这样的再去租房基本工资就要被花完。或许我目前还是更适合在初创企业干活,入职不用跟着大部队校招,工资也不会太低。
此外有两个感想,一个是我需要了解下 iOS 开发的新潮流(Swift,函数式等)了,一个是我今年应该尽力入了 3D Art / CG 这个坑,特别是在 Octane Renderer 改成订阅制后。


今天前司被百度收购一事终于公布了,陈叔说需要我回来。因此这学期应该就还是回渡鸦 RavenLab 干活。工作地点自然不在杭州,这里面的困难就和妹子两个人努力克服好了。
至于工作本身,我还是挺满意的。本身我是不在乎什么大小公司头衔的,但现在可以顶着百度 offer 名义的话还是容易和学校就大三离校这件事上交涉些。工作的其他方面都和被收购之前差不多,也不详谈了。
工作定下来后,预计下周就要回去入职。突然发现有很多事情要赶在入职前收尾,但不管怎么说都算是个好事。


十四号和妹子看了 La La Land,推荐。此外电影的原声可以一听。
和妹子在一起是一个非常有趣的过程,因为自己很多做得不到位的地方会被发现出来。此外,我日常是一个即使和我开玩笑我也会考虑实施可行性的人,结果遇到了一个脑洞略大又充满好奇心的女生。有时候聊天时会莫名地被感染,觉得倒也不是什么事情都需要细细考虑一番,也不是什么事情都需要想得那么清楚,开心就好。


本周听了 FKJ - SkylineJellis - OriginPiper - Hot SandJustin Hurwitz - Epilogue