您的位置:首页 > 移动开发 > Unity3D

Unity 通过摄像机移动实现连续滚动的背景

2014-04-20 00:28 701 查看
第一篇技术博客,请大家多多关照。

最近从 Web转型做 Unity开发,当初接触Unity主要也是因为它里面应用到了一个我比较感兴趣的 开源项目--Mono,俗称“开源的DotNet”,就是你可以使用 C#做跨平台的应用开发。我也是去年这个时候初步了解了一下 使用C#开发Android项目,以后等有时间了再把相关的技术博客给补上吧。其实Unity在跨平台的发不上也很大程度借助了Mono,虽然脚本只是Unity开发中的一部分。

言归正传,我们还是说Unity。学习Unity也有一段时间了,总感觉什么地方都学了那么点,但高阶技术点用的也不是那么很熟。所以决定经常性的把自己的所学都总结出来,和大家分享一下,大家一起进步,让我们共同进步。

学习Luffy的一句话“Unity主程,我当定啦!”

第一篇博客打算讲一下如何实现一个类似于 横版跑酷类游戏的背景的不断移动的效果。因为像背景这样的元素如果把它做成每一个关卡用一张完整的贴图是不太符合实际情况的。我们可以用几张风格相同的图片的不规则切换来实现我们的背景效果,而且当我们的主角移动到一个位置的时候,他走过的路的背景就已经没有必要去显示了,我们就可以把之前的贴图给移除掉。

 

大致的原理:我们通过 从边缘发出的射线来判断 当前摄像机在这一帧和上一帧拍到的是不是同一张贴图,如果不是的话就说明刚才那个贴图的地方,摄像机已经移动过去了,就可以把它删除了。

 

首先我们需要把 Camera 设置为 Orthographic正交投影

在场景刚加载的时候,我们先实例化3个一次的背景出来·,将其位置分别摆正

然后在 Camera 不断的移动中,通过Camera中心点和边缘发出的设想来判断是否将 上一个贴图给删除。Bingo,So easy

void Update()
{
transform.Translate(new Vector3(moveSpeed * Time.deltaTime, 0, 0));
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.forward, out hit, 20))
{
float x = hit.point.x;
RaycastHit otherHit;

Vector3 v1 = new Vector3(x - 10, transform.position.y, transform.position.z);
Vector3 v2 = v1 + Vector3.forward * 20;
Debug.DrawLine(v1, v2, Color.red);
if (Physics.Raycast(new Vector3(x - 10, transform.position.y, transform.position.z), Vector3.forward,
out otherHit, 20))
{
if (lastPlane.GetInstanceID()!=otherHit.collider.gameObject.GetInstanceID())
{

if (lastPlane!=null)
{
Destroy(lastPlane);
GameObject planeClone1 = (GameObject)Instantiate(plane.gameObject);
planeClone1.transform.position = new Vector3(transform.position.x +15, 0, 0);

}
lastPlane = otherHit.collider.gameObject;
}
}
}
}


代码其实很简单,代码中的一些常量也是根据图片大小调整出来的。

来看一下简单的效果:Chopper



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity
相关文章推荐