01 C#抽象类
抽象类中的抽象属性和抽象方法必须是公有的,子类必须重写抽象类中的所有抽象属性和抽象方法。
抽象类不能实例化,它只提供部分实现,另一个类可以继承它并创建实例。
对于虚方法,父类会做一些实现,子类可以用base.some()的形式调用父类的方法。而当父类中的方法完全不知道去干什么,必须子类重写才有意义,那就要用抽象方法了。如:
public abstract string Name
{
get;
}
那么继承并重写如下:
public class OnClickAnimNode : AnimNode
{
public override string Name
{
get
{
return "OnClick";
}
}
}
02 VS DLL引用与.vs文件夹
今天发现拷贝一个项目的时候没有拷贝.vs目录,代码中using引用dll的命名空间都标红了。尝试拷贝了该目录后解决了该问题,所以虽然csproj文件含有<Reference Include="">,但是不拷贝.vs目录的话要重新添加一遍DLL引用。
03 Unity Resources.Load<>()
比如:
bgClip = Resources.Load<AudioClip>("Sound/Bg");
或者:
public Texture[] startTexs;
startTexs = Resources.LoadAll<Texture>("UI/Splash");
又或者:
IEnumerator LoadPrefab()
{
ResourceRequest rr;
yield return new WaitForSeconds(0.1f);
rr = Resources.LoadAsync<GameObject>("Player");
yield return new WaitUntil(() => rr.isDone);
vrCam = rr.asset as GameObject;
vrCam.gameObject.SetActive(true);
vrCam = Instantiate(vrCam, vrCam.transform.position, vrCam.transform.rotation);
rr = Resources.LoadAsync<GameObject>("Prefabs/videoSphere");
yield return new WaitUntil(() => rr.isDone);
Instantiate((GameObject)rr.asset, sphereVideo.transform);
}
这里就用到了Unity加载资源的一些API,最简单的是Resources直接Load,里面指定类型,如AudioClip或者Texture等,然后传参是一个string类型的路径,注意不能含有文件后缀。这里要求资源放在Resources路径中,我们一般把Resources目录放在Assets下,其实不是直接在Assets下也可以,保持名字对就可以。意思是比如Assets目录下有个temp目录,该目录下有个Resources目录,同样可以用Resources.Load加载。这样就和Editor目录类似了,就是有该目录就会有效果,不必紧跟着Assets目录下。
LoadAll则比Load多一点功能,能加载多个资源,比如Resources/UI/Splash/路径下的所有Texture都加载进来,得到一个Texture数组。
LoadAsync则是异步方法,ResourceRequest的isDone来判断该异步任务是否完成,然后就可以rr.asset as GameObject了,当然直接用(GameObject)这样转换也一样,接着就可以对预制体进行实例化了,指定预制体对象,位置和角度或者其他重载方法传值即可。
04 Unity 按键
按键ABCD的了解,Alpha0却不知道:
void Update ()
{
if(Input.GetKeyDown(KeyCode.Alpha0))
{
Debug.Log("Number 0 pressed.");
}
}
Alpha0按键是数字按键0,Keypad0则是右侧小键盘上的数字按键0。
要注意GetKey和GetKeyDown不一样,从名字也能看出来,GetKey在Update方法中,由于其被按住时一直检测,所以你可能按下一次,却打印多条。
05 Unity中的查找
比如:
GameObject.Find("Name")
这样是查找场景中名为“Name”的对象,且要求是活跃的。
如果是:
transform.Find("Name")
则找的为该对象下名为Name的对象,且不论是否活跃都能找到。
06 Unity Stencil
在做遮罩的时候可以用Stencil,具体介绍参考:
http://gad.qq.com/article/detail/29609
比如shader中有一段属性:
Properties {
_main_tex ("main_tex", 2D) = "white" {}
_Stencil("Stencil ID", int) = 0
_trans ("trans", Range(0, 1)) = 1
[HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
那么我们可以控制其中的_Stencil值来控制渲染结果:
void SetStencil(int value)
{
foreach (var v in transform.GetComponentsInChildren<MeshRenderer>(true))
{
if (v.transform == mask) continue;
if (v.material != null && v.material.HasProperty("_Stencil"))
{
v.material.SetInt("_Stencil", value);
}
}
}
Stencil:
Stencil {
Ref[_Stencil]
Comp equal
Pass keep
}
Comp比较方法拿Ref参考值与当前缓存值比较,设置为equal即相等的时候才能通过,Pass后则用Keep表明直接不管。
这里我使临时查资料记录下,shader的东西以后慢慢补充,争取能更详细解释。