unity传送门类似效果实现
简述
在传送门中,核心的玩法是在地上或者墙上打开2个可以联通的洞来实现传送的效果。以此扩展加入解谜要素构成游戏的核心。
这里尝试使用unity来实现传送门的核心功能,具体功能分析如下:
1、传送门的模型
2、传送门的贴图
3、传送门的传送功能
这里我们需要以下软件:3dmax 2014,unity3d 5.4.0,visual studio 2015
一、传送门的模型和uv
打开3dmax,确认系统单位和显示单位都为米,如果不为米,改成米

建立一个圆柱体,高度段数1,端面分段1,边数32,调整到适当大小,转化为可编辑多边形,删除除了顶部面之外的所有面,位置归0。再次转化为可编辑多边形。

使用uvw展开命令,进行uv展开

更改模型的名称和材质的名称,导出fbx文件

二、传送门的动态贴图
1、静态效果实现
打开unity,导入模型,导入一个适当的场景包作为测试场景,创建一个可以用键盘控制的Player,用于场景游历和功能测试


创建一个新的摄像机,放在其他位置,作为传送的目标点。创建一个RenderTexture,拖拽到摄像机的Target Texture上。将摄像机的Clear flag改为solid color。适当更改相机的Viewport Rect。
将导入的传送门模型拖拽到场景中,放置在一面墙上,设置模型材质的贴图为RenderTexture。
可以看到效果如下

2、动态效果实现
传送门的效果类似与一个洞,在不同的位置看过去,显示的大小和物件都是有差别的。就类似你通过一个窗户看外面的世界类似。所以,我们要根据玩家的摄像机相对与传送门的相对位置关系,来设置目标点摄像机的相关数据,比如,视角,位置,选择和裁剪等。
- 目标摄像机和传送点的距离=玩家和传送门的距离
- 目标摄像机的裁剪距离=目标摄像机和传送点的距离
- 目标摄像机始终朝向传送点
- 目标摄像机的视角=2*Atan(传送门高度/2/目标摄像机和传送点的距离)
注意Atan在unity中为弧度,需要再乘上Mathf.Rad2Deg转成角度
部分代码如下(这里利用父子关系实现位置变化,目标摄像机为传送点的子物体,所以目标摄像机的localposition也就是相对于传送点的相对距离)
internal protected void Update()
{
var cpos = Camera.main.transform.position;
var mt = Render.worldToLocalMatrix;
mt = Matrix4x4.TRS(Vector3.zero, Quaternion.AngleAxis(180, Vector3.up), Vector3.one) * mt;
Camera.transform.localPosition = mt.MultiplyPoint(cpos);
Camera.transform.LookAt(Point);
Camera.nearClipPlane = -Camera.transform.localPosition.z;
const float renderHeight = 3f;
Camera.fieldOfView = 2 * Mathf.Atan(renderHeight / 2 / Camera.nearClipPlane) * Mathf.Rad2Deg;
}
三、传送功能实现
在传送门上增加一个collider,设置为Trigger,当玩家与之发生碰撞的时候设置玩家的位置数据
- 玩家的位置=传送点的位置,
- 玩家相对与传送点的朝向=传送前,玩家相对于传送门的朝向
部分代码如下
internal protected void OnTriggerEnter(Collider other)
{
other.transform.root.rotation = other.transform.root.rotation * Point.rotation * Render.rotation;
other.transform.root.position = Point.position;
}
总结
本项目整体难度不大,大约花费时间2天
目前项目已经开源,地址为http://git.oschina.net/CodeGize/PortalGame,可以前往下载
演示地址:http://v.youku.com/v_show/id_XMTY5MzE3MzU0MA==.html
unity传送门类似效果实现的更多相关文章
- Unity Shader - 消融效果原理与变体
基本原理与实现 主要使用噪声和透明度测试,从噪声图中读取某个通道的值,然后使用该值进行透明度测试. 主要代码如下: fixed cutout = tex2D(_NoiseTex, i.uvNoiseT ...
- unity,荧光效果(bloom)实现过程
两个月前,刚接触unity的时候费了半天劲儿做了个荧光效果(见:http://www.cnblogs.com/wantnon/p/4430749.html),今天终于抽空整理了一下,把过程写下来. 荧 ...
- 关于Unity中粒子效果的使用
粒子效果1: 游戏中会有很炫酷的特效,比如爆炸,水花,火焰等;2: unity提供粒子编辑器,方便特效人员来开发很炫酷的特效;3.粒子效果一般有专门的粒子特效师来做,我们只需要拿来用就好了,很多参数没 ...
- unity 图片 粉碎效果 破碎效果
效果: 点击按钮后: 这些碎片具有物理碰撞效果,下面会有隐形的支柱垫着碎片,n秒后支柱消失,碎片落下 当然你也可以控制生成的碎片,让他们从下而上一块一块地落下 插件源码: https://github ...
- Unity光晕剑效果的Shader简单实现
最近遇到了一个需求,想要一种在刀剑上带有光晕的酷炫效果,甚至是还想要有闪烁呼吸效果,于是就写了一个简单的叫LightSwrod的Shader去实现,先上图看看效果吧. 简单展示 这是剑本身的样子 这是 ...
- Unity音乐喷泉效果
本文参考了该文,其素材也取之于该处 效果 实现效果(根据音乐的高低会产生不同的波纹): 可以观看视频来获得更好的体验. 波纹的实现 先模拟出如下效果: 通过鼠标的点击,产生一个扩散的圆圈. 如上图所示 ...
- Unity 实现橡皮擦效果
我所实现的橡皮擦效果是设置图片某点的像素的透明度为0,来简单实现擦除效果的: 下面是效果 首先需要注意两点:1:设置 Main Camera 的 projection 属性为Orthographic ...
- Unity 屏幕震动效果实现
要实现震屏效果其实并不难,所谓的震屏在PC端可以简单地理解为相机(MainCamera)的抖动. 代码实现如下: using UnityEngine; using System.Collections ...
- unity 实现流光效果
1.通过一些简单效果可以让我们更好的去理解shader,具体都在代码注释中: Shader "Unlit/MoveLightImage" { Properties { //主纹理 ...
随机推荐
- iOS Storyboard创建APP 的国际化操作
Storyboard创建APP 的国际化操作 最近在看<X-code江湖录>这本书,看到了APP 国际化这点,刚刚也简单的实践了一下.现在和大家分享分享! 写的这个简单的Demo全都是用 ...
- 【读书笔记】-- JavaScript模块
在JavaScript编程中我们用的很多的一个场景就是写模块.可以看成一个简单的封装或者是一个类库的开始,有哪些形式呢,先来一个简单的模块. 简单模块 var foo = (function() { ...
- Python学习的个人笔记(基础语法)
Python学习的个人笔记 题外话: 我是一个大二的计算机系的学生,这份python学习个人笔记是趁寒假这一周在慕课网,w3cschool,还有借鉴了一些博客,资料整理出来的,用于自己方便的时候查阅, ...
- PHP 用session与gd库实现简单验证码生成与验证的类
验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的.目前大大小小的网站都有验证码.今天自己实现了一个简单的验证码类.说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下.当然,因为 ...
- Javascript面对对象. 第一篇
Javascript,有两个种开发模式: 1.函数式(过程化)2.面对对象(oop),面对对象语言有一个标志,就是类,而通过类可以创建任何多个属性和方法,而Ecmascript没有类的概念,因此它的对 ...
- 尝试回答js问题
看到@玉伯的这篇文章<Sea.js 源码解析(三)>给的几个问题,在综合下面的评论,写出自己的总结: 我们知道 typeof new String("xxx") 返回 ...
- jQuery中绑定事件bind() on() live() one()的异同
jQuery中绑定事件的四种方法,他们可以同时绑定一个或多个事件 bind()-------------------------版本号小于3.0(在Jquery3.0中已经移除,相应unbind()也 ...
- 2017-2-20 C#基础 运算符
C#的运算符主要分五种:算数运算符,关系运算符,逻辑运算符,条件运算符,赋值运算符.算术运算符有 + - * / % ++ --;关系运算符有 == != > ...
- 原来JS是这样的 - 提升, 作用域 与 闭包
引子 长久以来一直都没有专门学过 JS ,因为之前有自己啃过 C++ ,又打过一段时间的算法竞赛(写得一手好意大利面条),于是自己折腾自己的网站的时候,一直都把 JS 当 C 写.但写的时候总会遇到一 ...
- web性能优化 来自《web全栈工程师的自我修养》
最近在看<web全栈工程师的自我修养>一书,作者是来自腾讯的前端工程师.作者在做招聘前端的时候问应聘者web新能优化有什么了解和经验,应聘者思索后回答“在发布项目之前压缩css和 Java ...