Unity项目Lost Crypt分析-2
parallax视差脚本
在环境的每个层上都有一个parallaxlayer的脚本控制视差效果。内容很简单:
void Start()
{
cameraTransform = Camera.main.transform;
startCameraPos = cameraTransform.position;
startPos = transform.position;
}
private void LateUpdate()
{
var position = startPos;
if (horizontalOnly)
position.x += multiplier * (cameraTransform.position.x - startCameraPos.x);
else
position += multiplier * (cameraTransform.position - startCameraPos);
transform.position = position;
}
原理是记下相机的初始位置,然后物体的位移等于相机位移乘以一个系数。越近移动就越小。远景的系数为正,中景是没有这个脚本的。近景的系数为负数。从左侧的图中可以看到图像的移动情况。
Parallax.gif
Sprite Shape
参考:https://docs.unity3d.com/Packages/com.unity.2d.spriteshape@2.1/manual/index.html
Sprite Shape 是创建2D场景的强大工具。由两部分构成:profile和controller。Profile中包含要用的sprite和角度等设定,在Controller中可以编辑曲线。
对于要使用的Sprite
- Texture类型为Sprite
- 模式为Single(经实验,multiple也行,在其中选择你需要的那个就行了)
- Mesh Type为Full Rectangle
Sprite Shape工作流
Create Sprite Shapes in following the steps:
- Create a Sprite Shape Profile from the main menu (menu: Assets > Create > Sprite Shape Profile). Select from the two available options:
- Create Angle Ranges and assign Sprites in the Sprite Shape Profile.
- Drag the Sprite Shape Profile into the Scene to automatically generate a Sprite ShapeGameObject based on that Profile.
- You can create a Sprite Shape GameObject without a Profile from the main menu (menu: GameObject > 2D Object > Sprite Shape). Then select a Sprite Shape Profile in the Sprite Shape Controller's Profile settings. The same Profile can be used by multiple Sprite Shapes.
- Edit the outline of the Sprite Shape with the Sprite Shape Controller component settings.
- Enable Physics2D interactions for your Sprite Shapes by attaching a Collider component.
创建Profile时,Open和Close随便创建一个就行,区别在于角度不同。创建后设置一下填充的Texture和边界的Sprite,然后拖入场景,在它的Controller中编辑Spline就可以了。
花草
Background中的Near物体花草都使用了Sprite Shape。
image.png
其中,花作为草的子物体,还附着了一个ConformingSpline的脚本,用来在父对象(也就是草地)更新的时候(检查hashCode是否发生改变),更新自身的Spline。具体原理就是找到Controller的Spline,生成序列化对象后更新其m_spline属性。
最后,注意花和草使用的材质中修改了RenderQueue。关于这个的用途,是渲染的顺序,但并不是说顺序越靠后的最后渲染。关于什么物体在上什么在下还是由Z-Order,也就是物体离摄像机的远近决定的,只有在Shader决定禁用z-order的情况下,RenderQueue才会决定哪个物体渲染在上。参见:https://forum.unity.com/threads/how-does-renderqueue-work.98369/
AutoMask_Lit
看一下某些草和柱子使用的这个shader。
在颜色方面,它添加了白平衡节点,用前两个参数可以调节色温和色彩。在mask方面,它首先用一个0饱和度获得灰度图像,与Alpha相乘得到图像的非透明区域。然后用Mask Strength控制mask的力度,用Mask Contrast控制mask的对比度。
image.png
目前还没有找到Sprite Lit的文档,git上显示为404. @_@。但是这个mask应该可以用来实现光照在上面时候的光斑。
image.png
看下图:
mask.gif
当调整mask 的强度的时候,结合上后期处理的效果,就会产生极强的光斑效果:
mask1.gif