Unity与C#学习记录 - 02

14 篇文章 0 订阅

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的东西以后慢慢补充,争取能更详细解释。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值