在傳送門中,核心的玩法是在地上或者牆上打開2個能夠聯通的洞來實現傳送的效果。以此擴展加入解謎要素構成遊戲的核心。php
這裏嘗試使用unity來實現傳送門的核心功能,具體功能分析以下:html
一、傳送門的模型git
二、傳送門的貼圖app
三、傳送門的傳送功能ide
這裏咱們須要如下軟件:3dmax 2014,unity3d 5.4.0,visual studio 2015測試
打開3dmax,確認系統單位和顯示單位都爲米,若是不爲米,改爲米spa
創建一個圓柱體,高度段數1,端面分段1,邊數32,調整到適當大小,轉化爲可編輯多邊形,刪除除了頂部面以外的全部面,位置歸0。再次轉化爲可編輯多邊形。.net
使用uvw展開命令,進行uv展開3d
更改模型的名稱和材質的名稱,導出fbx文件code
打開unity,導入模型,導入一個適當的場景包做爲測試場景,建立一個能夠用鍵盤控制的Player,用於場景遊歷和功能測試
建立一個新的攝像機,放在其餘位置,做爲傳送的目標點。建立一個RenderTexture,拖拽到攝像機的Target Texture上。將攝像機的Clear flag改成solid color。適當更改相機的Viewport Rect。
將導入的傳送門模型拖拽到場景中,放置在一面牆上,設置模型材質的貼圖爲RenderTexture。
能夠看到效果以下
傳送門的效果相似與一個洞,在不一樣的位置看過去,顯示的大小和物件都是有差異的。就相似你經過一個窗戶看外面的世界相似。因此,咱們要根據玩家的攝像機相對與傳送門的相對位置關係,來設置目標點攝像機的相關數據,好比,視角,位置,選擇和裁剪等。
注意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,能夠前往下載