unity3d:
Pixels Per Unit
有个很奇怪的事情,当把图片拖到舞台之后会发现图片很小很小,查阅说明发现是这个值的原因。
理解就是unity里有个自己的尺寸标准unit,引入图片的时候需要约定好多少像素对应1unit,比如图片A是1024像素和图片B是1像素,都是这对应1unit,那么拖到舞台这两个图是一样大的。
多次实践后理解下,用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组件。