从0开始学Unity做SLG系列(杂记)

5 篇文章 0 订阅
4 篇文章 0 订阅

unity3d:

Pixels Per Unit

  有个很奇怪的事情,当把图片拖到舞台之后会发现图片很小很小,查阅说明发现是这个值的原因。
  理解就是unity里有个自己的尺寸标准unit,引入图片的时候需要约定好多少像素对应1unit,比如图片A是1024像素和图片B是1像素,都是这对应1unit,那么拖到舞台这两个图是一样大的。

Unity3D 游戏画面像素与单位关系。

多次实践后理解下,用Image然后贴图的形式就是原大,直接拖进来就会小100倍(1unit),但是从运行后的结果看,两个是一样大的

怎么给图片添加点击事件

image:
如果你的图片是用UGUI做的,那么默认应该在hierarchy界面有个EventSystem,它是用来识别UI事件的,在你的图片对象中添加EventTrigger组件,然后设置事件类型,比如点击就是PointerClick,最后给事件添加执行的对象和相关方法。
添加一个2dxxx的碰撞器

sprite:
添加一个2dxxx的碰撞器
添加一个OnMouseDown的回调函数

获取点击到的物体

物体必须带有BooxColider属性,才能通过物理检测到

        // 使用主摄像机创建一根射线,射线的方向是鼠标点击的位置(从摄像头位置到鼠标点击位置的一条射线)
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //保存触碰到的对象
        RaycastHit hit;
        //使用物理类检查射线的碰撞,保存在hit, 射线碰撞到"Graound"层
        bool isCollider = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("Default"));
        //如果点击物体存在
        if (isCollider)
        {
            GameObject m_baseBuilding = hit.collider.gameObject;
            Debug.Log(m_baseBuilding.name);
        }

加载Profab

加载到内存,然后实例化

        BuildBtnPanel m_buildBtnPanel = Resources.Load<BuildBtnPanel>("Prefabs/Home/BuildBtnPanel");
        if (m_buildBtnPanel)
        {
            BuildBtnPanel m_fab = Instantiate(m_buildBtnPanel, Vector3.zero, Quaternion.identity) as BuildBtnPanel;
            //m_fab.transform.localPosition = new Vector3(112, 393, 0);
        }

Sprite和Image区别

一篇详细文章
渲染上:
Image 通过UGUI的Image和CanvasRenderer组件组件来渲染
Sprite 通过SpriteRenderer组件来渲染
两者在视觉上没有任何区别(都使用默认材质时)。它们默认的渲染也都是在Transparent Geometry队列中。

使用上:
Image需要位于某个Canvas下才能显示出来。场景中的Sprite可以像普通的3D游戏物体一样对待,通过Transform组件进行移动等操作,而Image则使用RectTransform进行布局,以便通过Canvas统一管理。由于RectTransform可以设置大小、对齐方式等,Image可以说更加方便一点,这也是很多人选择使用Image的原因。
在引擎的处理上:
将Wireframe选项打开然后在场景中观察,就可以清楚地发现,Image为一个矩形的Sprite生成两个三角形拼成的矩形几何体,而Sprite则会根据显示内容,裁剪掉元素中的大部分透明区域,最终生成的几何体可能会有比较复杂的顶点结构。

由渲染管线的基本流程进行推断:
1.Sprite由于顶点数据更加复杂,在进行顶点计算时会比Image效率更低;
2.Sprite会比Image执行较多的顶点着色器运算;
3.Image会比Sprite执行更多的片段着色器运算
由于片段着色器是针对每个像素运算,Sprite通过增加顶点而裁剪掉的部分减少了相当多的运算次数,在绝大多数情况下,反而比Image拥有更好的效率(尤其是场景中有大量的2D精灵时)。SpriteRenderer会创建额外的几何体来裁剪掉多余的透明像素区域,从而减少了大量的片段着色器运算,并降低了overdraw;而Image则会创建简单的矩形几何体。随着2D元素数量的增加,这种差别会慢慢明显起来。
因此在2D游戏开发中,游戏场景中的元素,应该尽量使用它去渲染。而Image应该仅用于UI显示(实际上即使不考虑性能原因,由于屏幕分辨率的变化,Image可能会被Canvas改变显示位置和实际大小,如果用于游戏内元素的显示,可能会造成跟预期设计不一致的显示结果,也应该避免使用)。

报错

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.

是因为后来创建了一个camera,因为camera中自带一个组件Audio Listener。所以有两个camera就有两个audio listener导致报错。

一个简单的解决方法就是删掉其中一个camera中的audio listener组件。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值