APP下载

基于Unity 3D的第三人称摄像机被遮挡的处理

2016-12-06谢吉刚

电子测试 2016年21期
关键词:第三人称障碍物射线

谢吉刚

(南京工业职业技术学院计算机与软件学院,江苏南京,210023)

基于Unity 3D的第三人称摄像机被遮挡的处理

谢吉刚

(南京工业职业技术学院计算机与软件学院,江苏南京,210023)

针对涉及第三人称视角游戏中,因摄像机和游戏主角之间存在一定的距离,容易出现障碍物遮挡,会影响用户体验的情况。可采用射线方法来探测障碍物,并在出现遮挡时将遮挡障碍物做透明化处理。

游戏;障碍物遮挡;射线方法

在3D游戏中,一般采用第一人称视角或者第三人称视角。第三人称视角的实现方法一般是让一架摄像机始终保持一定距离和角度跟随主角。这种视觉使玩家不但能够观察整个场景的情况,同时也能够把握主角的运行状态,因此可操作性强,而且易于上手。一般战略类动作类游戏基本上都是采用的这种视角。但是这种视角容易出现一个问题,就是当主角运动到某个位置,这里正好有一个障碍遮挡在主角和摄像机之间,就会使主角看不见,同时可能部分或全部场景也被障碍物挡住,使玩家无法正常操作,非常影响用户体验。有人采用的方法是出现遮挡后,将摄像机拉近,使摄像机越过障碍,但是这样会使角色突然变大,场景画面也会出现较大的变化,画面出现明显抖动。而且由于摄像机移动造成视角的变化,会影响玩家的操作。因此本文提出另一种处理方法:在出现遮挡的时候,将障碍物进行透明化处理,这样既能让玩家发现障碍物的存在,同时也不会影响玩家的观察视角,保证了良好的用户体验。本文以一款用Unity 3D开发的第三人称视角坦克游戏为例来说明该问题的处理原理和基本方法。

1 问题的提出

在游戏中,玩家控制主角——坦克在场景中移动,同时搜寻敌人并发起攻击。摄像机跟随坦克移动。场景中有墙、房屋、树等障碍物。当坦克运动到墙的前面时,由于摄像机在墙后面,可以看到坦克被墙挡住了,玩家的视线出现了遮挡(如图1)。这时玩家很难判断坦克的状态,也看不到墙后面的情况,游戏的进行受到了影响。

图1 障碍物遮挡现象

2 问题解决原理

为解决上面的问题,首先应该做出是否出现遮挡的判断,进而确定是哪个障碍物发生了遮挡。用Unity 3D中常见的射线方法可以很好的解决这个问题。当主角移动的时候从主角向摄像机方向发射一条射线,如果射线碰撞到的第一个对象是“摄像机”,表示主角和摄像机之间没有别的模型遮挡,不需要做任何处理。如果射线碰撞到的第一个对象不是摄像机,那么就表示主角和摄像机之间有其他模型,出现了摄像机被遮挡的情况(如图2)。然后需要进一步检测障碍物是哪个模型,接着将该模型变为透明形式。

图 2 遮挡的判断

2.1产生射线

Unity 3D射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。射线多用于碰撞检测、角色移动等等。Ray为Unity3D中的射线类。创建一条射线的方法是Ray (origin: Vector3, direction: Vector3),Ray.origin为射线起点,Ray. direction为射线的方向。

在本例中,射线起点为主角位置,射线终点为摄像机。因此可以这样生成射线。

Ray ray=new Ray(Vector3.Player, transform. MainCamera);

2.2射线的碰撞检测

Unity 3D用Physics类来处理场景中可能用到的物理运算。该类具有多个射线碰撞检测方法,这里我们使用Physics. Linecast方法,即线性投射。该方法用来检测射线是否与某游戏对象相交。如果该方法返回true则表示相交,返回则表示未相交。该方法在仅检测线性投射区域,因此效率比较高。形式有 Linecast (start: Vector3, end: Vector3, out hitInfo: RaycastHit),其中start和end表示射线的起点位置和方向,out hitInfo为输出具体碰撞信息。如果发生碰撞,具体碰撞数据和被碰撞体都会被记录在RaycastHit结构上。

利用该方法写出以下的碰撞检测处理程序

2.3障碍物半透明处理

检测到遮挡的障碍物后,如果要修改障碍物材质的透明度以使障碍物变得透明。为此需要首先设定该模型支持透明材质。选定障碍物模型,进入Inspector面板,找到Mesh Renderer选项卡,选择Shader选项,设定材质shade的选项值为Transparent/ Diffuse(如图3)。此时该模型即可支持透明材质。

如果该模型遮挡了主角,需要将该模型的透明度降低。方法是修改模型的材质透明度color.a的值。color.a为1表示材质完全不透明,0是完全透明。此处将透明度设定为0.5,即半透明(如图4)。可以看出,障碍物变得半透明了。主要代码如下。

Color color = obj.renderer.material.color;//取出碰撞对象的颜色给color

color.a = 0.5f;//修改对象的颜色的a通道值

obj.renderer.material.SetColor("_Color", color);

//重设对象的a通道值以半透明处理

图 4 障碍半透明处理

经过透明化处理后,玩家既能看到障碍物的存在,同时也能够看到障碍物后面的情况,却不需要进行场景视觉的变化,保证了玩家的游戏体验。

3 问题的进一步讨论

试验表明,该方法对于墙和房屋之类的比较规则的障碍物的遮挡问题解决的非常好。但是当出现比如树或零星碎石之类的不规则物体,由于出现了遮挡和不遮挡的频繁变换,使得障碍模型较频繁的出现透明度变化,从而引起画面和摄像机的抖动。改进方法是尽量将不规则障碍添加较为规则的BOX,然后把Mesh Collider换成Box Collider,这样既可以提高系统运行效率,也能适当降低修改透明度频率。

[1] 宣雨松. Unity 3D游戏开发[M]. 北京:人民邮电出版社2012,6: 182-185

[2] Michelle Menard(美)著 史晓明,李强 译. Unity游戏开发实战[M] . 北京:机械工业出版社 2012,4:165-172

[3] 程明智. Unity游戏开发技术[M].北京:国防工业出版社2012,8: 112-114

[4] 吴亚峰. Unity 3D游戏开发技术详解与典型案例[M].北京:人民邮电出版社 2012,11: 143-148

The third person perspective camera with occluded

Xie Jigang
(Nanjing Institute of Industry Technology,Nanjing,210016,Computer and Software College)

In third person game, because a certain distance between the camera and the protagonist,prone to shelter situation,very influence of the user experience.If the ray method to detect obstacles,in the presence of occlusion the occlusion obstacles do transparent treatment can be a very good solution to this problem.

game;Occlusion;ray method

图 3 材质支持透明的设置

猜你喜欢

第三人称障碍物射线
“直线、射线、线段”检测题
高低翻越
SelTrac®CBTC系统中非通信障碍物的设计和处理
赶飞机
谈谈英语教学中 第三人称单数及其后面动词的用法
『直线、射线、线段』检测题
用第三人称和自己说话能减压
It’s Your Turn, Roger! (I)
赤石脂X-射线衍射指纹图谱
γ射线辐照改性聚丙烯的流变性能研究