13.04.2015 Views

東海大學‧資訊工程學系

東海大學‧資訊工程學系

東海大學‧資訊工程學系

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

東 海 大 學<br />

資 訊 工 程 學 系<br />

專 題 研 究 報 告<br />

3D 動 畫 之 設 計 與 實 作 : 以 東 海 資 工 系 導 覽<br />

為 例<br />

3D Animation Design and Implementation:<br />

Visiting CS Department of Tunghai as an<br />

Example<br />

指 導 教 授 : 林 祝 興 老 師<br />

學 生 :963805 林 容 暄<br />

963819 張 通 傑<br />

中 華 民 國 九 十 九 年 十 二 月


目 錄<br />

第 一 章 、 緒 論 ...................3<br />

1.1 摘 要<br />

1.2 研 究 動 機 與 目 的<br />

第 二 章 、 技 術 背 景 ...............4<br />

2.1 MAYA2011<br />

2.2 UNITY3D<br />

2.3 FBX<br />

第 三 章 、 程 式 概 述 ...............8<br />

3.1 人 物 的 主 要 部 分<br />

3.2 電 梯<br />

3.2.1: 升 降 台 部 份<br />

3.2.2 電 梯 : 用 來 控 制 電 梯 停 住<br />

3.2.3 電 梯 : 按 鈕 控 制 ( 往 下 )<br />

3.3 視 窗 功 能<br />

3.4 拖 曳 剛 體 ( 門 )<br />

3.5 瞬 移 程 式 碼<br />

3.6 影 子 程 式 碼<br />

第 四 章 、 專 題 實 作 ..............11<br />

- 1 -


4.1 建 模<br />

4.2 貼 圖<br />

4.3 匯 入<br />

4.4 完 成 圖<br />

第 五 章 、 總 結 ..................21<br />

5.1 實 作 問 題 討 論 :<br />

5.2 專 題 心 得 - 林 容 暄<br />

5.3 專 題 心 得 - 張 通 傑<br />

5.4 展 望<br />

第 六 章 、 參 考 文 件 ..............24<br />

附 件 一 .................................25<br />

附 件 二 .................................44<br />

附 件 三 .................................46<br />

附 件 四 .................................47<br />

附 件 五 .................................49<br />

附 件 六 .................................51<br />

附 件 七 .................................54<br />

附 件 八 .................................56<br />

- 2 -


一 、 緒 論<br />

1.1 摘 要<br />

由 於 電 腦 科 技 的 發 展 日 新 月 異 , 電 腦 動 畫 也 迅 速 的 在 蓬 勃 發 展 , 從 早 期 的 2D 只<br />

有 上 下 左 右 的 移 動 方 式 , 到 3D 的 全 視 角 的 移 動 方 式 。 另 外 在 模 型 與 人 物 製 作 上<br />

伴 隨 著 科 技 的 發 展 越 來 越 精 緻 。 在 許 多 領 域 都 能 看 見 3D 動 畫 的 蹤 影 , 大 至 電 影 、<br />

遊 戲 , 小 至 廣 告 、 文 宣 , 電 腦 繪 圖 已 經 充 斥 在 我 們 日 常 生 活 周 圍 。<br />

結 合 網 路 的 發 展 , 例 如 房 屋 仲 介 透 過 網 路 來 呈 現 房 屋 的 樣 式 與 格 局 , 買 家 就<br />

可 透 過 網 路 檢 視 許 多 房 屋 , 便 可 節 省 買 家 時 間 , 以 增 加 閱 覽 房 屋 的 數 量 。 藉 由 目<br />

前 3D 繪 圖 軟 體 的 強 大 功 能 , 所 建 立 出 來 的 房 屋 的 場 景 已 可 媲 美 由 攝 影 機 所 拍 攝<br />

出 來 的 效 果 。<br />

承 襲 94 年 學 長 的 東 海 校 園 導 覽 使 用 的 MAYA 繪 圖 軟 體 , 在 建 模 方 面 加 以 學<br />

習 並 更 加 優 化 , 有 別 於 94 年 學 長 的 文 理 大 道 及 、 圖 書 館 以 及 中 正 堂 的 大 規 模 建<br />

築 , 這 一 次 我 們 注 重 在 單 一 建 築 的 優 化 與 細 節 , 進 而 從 大 規 模 的 文 理 大 道 縮 減 為<br />

資 工 系 系 館 ( 大 智 慧 科 技 大 樓 的 三 樓 和 四 樓 ), 除 了 導 覽 之 外 我 們 更 增 加 了 自 由 控<br />

制 的 系 統 , 讓 使 用 者 可 以 身 歷 其 境 , 在 電 腦 前 也 可 以 輕 鬆 的 了 解 東 海 資 工 系 系 館 。<br />

1.2 研 究 動 機 與 目 的<br />

接 下 專 題 之 後 , 經 過 多 次 的 討 論 , 決 定 承 襲 94 年 學 長 的 東 海 校 園 導 覽 製 作<br />

東 海 校 園 模 組 , 用 來 介 紹 各 個 學 院 以 及 東 海 校 園 環 境 , 然 而 在 建 模 與 外 掛 程 式 設<br />

定 的 過 程 中 有 許 多 的 挫 敗 , 而 後 聽 從 專 題 指 導 老 師 的 建 議 , 將 大 目 標 的 東 海 校 園<br />

導 覽 漸 漸 縮 小 到 資 工 系 系 所 導 覽 , 而 在 建 模 上 可 以 更 加 的 精 緻 , 外 掛 程 式 方 面 也<br />

可 以 加 入 更 精 細 的 裝 置 , 最 重 要 的 事 是 可 以 讓 使 用 者 操 控 第 三 人 稱 單 位 在 建 築 內<br />

移 動 , 轉 向 這 個 明 確 的 方 向 之 後 , 開 始 著 手 研 究 在 UNITY3D 裡 的 外 掛 程 式 要 如<br />

何 編 寫 , 與 模 型 之 間 的 配 合 度 及 相 容 性 也 是 一 個 課 題 , 而 在 MAYA 建 模 過 程 中 ,<br />

發 覺 門 、 窗 、 樓 梯 , 這 些 最 常 使 用 的 物 件 在 建 模 上 是 非 常 頻 繁 的 , 而 為 了 真 實 性<br />

還 是 讓 門 跟 電 梯 可 以 使 用 而 不 只 是 裝 飾 品 , 這 方 面 也 要 下 許 多 的 功 夫 , 門 牌 上 的<br />

提 示 可 以 更 清 楚 各 個 實 驗 室 的 研 究 方 向 以 及 研 究 目 的 , 希 望 這 個 應 用 程 式 可 以 讓<br />

加 入 東 海 資 工 的 同 學 或 學 弟 可 以 更 快 速 的 融 入 東 海 資 工 這 個 大 家 庭 , 利 用 我 們 的<br />

專 題 研 究 的 導 覽 可 以 快 速 的 了 解 資 工 系 系 辦 以 及 實 驗 室 的 位 置 。<br />

- 3 -


二 、 技 術 背 景<br />

2.1 MAYA 2011 介 紹<br />

MAYA 背 景 介 紹 :<br />

MAYA 原 公 司 為 Alias Wavefront。 當 時 所 研 發 的 軟 體 是 專 門 給 工 業 設 計 和 動<br />

畫 特 效 使 用 的 。Maya 的 推 出 一 舉 降 低 了 三 維 動 畫 製 作 的 成 本 , 在 Maya 推 出 之<br />

前 的 商 業 三 維 動 畫 製 作 基 本 上 是 由 SGI 工 作 站 的 Softimage 軟 體 所 壟 斷 ,Maya<br />

採 用 Windows NT 作 為 作 業 系 統 的 PC 工 作 站 , 降 低 了 設 備 要 求 , 促 進 了 三 維 動<br />

畫 的 普 及 , 隨 後 Softimage 也 開 始 向 PC 平 臺 轉 移 。<br />

在 2005 年 10 月 4 日 , 生 產 3D Studio Max 的 Autodesk 公 司 宣 佈 正 式 以 $1.82<br />

億 美 元 收 購 生 產 Maya 的 Alias, 之 後 也 收 購 了 Mud box。<br />

今 年 2008 年 Autodesk 公 司 將 旗 下 的 四 樣 軟 體 全 面 翻 新 , 推 出 最 新 版 本 ,<br />

Autodesk Maya 2009,Autodesk 3ds Max 2009,Autodesk Motion Builder<br />

2009,Autodesk Mud Box 2009, 稱 為 Autodesk 的 M4 全 方 位 解 決 方 案 , 讓 設<br />

計 開 發 人 員 可 以 將 無 限 的 想 像 具 體 實 踐 , 並 可 與 開 發 流 程 進 行 完 美 整 合 , 創 造 出<br />

款 款 創 意 無 限 的 精 彩 作 品 。<br />

Maya 在 現 在 電 影 特 效 製 作 中 應 用 相 當 廣 泛 , 著 名 的 星 際 大 戰 前 傳 就 是 採 用<br />

Maya 製 作 特 效 的 , 此 外 還 有 蜘 蛛 人 、 魔 戒 三 部 曲 、 侏 羅 紀 公 園 、 海 底 總 動 員 、<br />

哈 利 波 特 甚 至 包 括 頭 文 字 D 在 內 的 大 批 電 影 作 品 。<br />

MAYA 功 能 概 述 :<br />

1. 基 本 建 立 模 型 功 能 ..<br />

1.1User Interface.. 易 於 使 用 的 工 具 , 例 如 :Shelf 和 三 維 操 縱 器 , 加 快<br />

工 作 流 程 。<br />

1.2Modeling..Polygons、NURBS 和 細 分 表 面 建 模 工 具 。<br />

1.3Brush-based Technology ..Maya Artisan, Maya Paint Effects 和 3D<br />

Paint 提 供 全 套 集 成 的 筆 刷 工 具 , 用 於 建<br />

模 、 創 建 二 維 和 三 維 效 果 以 及 在 物 體 和 紋<br />

理 上 噴 塗 。<br />

2. 特 效 功 能 介 紹<br />

1.Visual Effects.. 利 用 物 理 定 律 確 定 的 硬 體 和 軟 體 的 高 速 、 動 態 相 互 作<br />

用 。<br />

2.Maya Fluid Effects.. 用 來 模 擬 天 氣 狀 況 、 煙 火 場 面 、 粘 性 流 體 甚 至 海<br />

洋 的 效 果 。<br />

3.Maya Fur.. 容 易 在 NURBS 或 者 多 邊 形 模 型 上 創 建 逼 真 的 毛 皮 、 頭<br />

髮 、 羊 毛 和 草 。<br />

- 4 -


4.Maya Cloth.. 可 以 模 擬 任 何 布 料 , 如 : 帆 布 、 皮 革 、 帳 篷 、 床 單 等 。<br />

5.Maya Live.. 實 現 二 維 實 拍 和 三 維 元 素 結 合 的 運 動 匹 配 。Maya Live 提<br />

供 更 好 的 靈 活 性 , 一 個 快 速 的 集 成 二 維 跟 蹤 器 和 一 個 互<br />

動 式 的 初 始 幀 解 算 器 。Maya Live 也 允 許 使 用 者 按 三 維<br />

物 體 重 新 構 建 實 拍 元 素 並 輸 出 到 外 部 應 用 程 序 。<br />

6.Maya Hair.. 在 NURBS 或 者 多 邊 形 物 體 上 全 動 態 長 髮 的 創 建 和 渲 染<br />

工 具 。 使 所 有 的 NURBS 曲 線 動 態 化 , 用 於 高 級 角 色 操 縱<br />

和 效 果 。 也 可 創 建 許 多 其 他 「 非 頭 髮 」 的 效 果 .<br />

3. 其 他 特 色 功 能<br />

1.Rendering.. 統 一 的 渲 染 工 作 可 通 過 共 同 的 界 面 輕 鬆 使 用 Maya 的 軟<br />

體 、 硬 體 、mental rayR 和 向 量 渲 染 器 。Toon Shader 可 以<br />

輕 鬆 地 創 作 出 繪 畫 效 果 , 並 模 擬 傳 統 2D 漫 畫 書 、 卡 通 和<br />

日 本 漫 畫 的 外 觀 。<br />

2.Maya API/SDK and MEL.. 通 過 嵌 入 式 腳 本 語 言 和 完 美 的 應 用 程 序 ,<br />

設 計 人 員 可 自 行 設 定 和 製 作 GUI 和 擴 展<br />

Maya 軟 體 功 能 。<br />

3.Animation.. 全 面 、 廣 泛 的 關 鍵 格 、 非 線 性 和 高 級 動 畫 編 輯 工 具 , 用 於<br />

創 建 、 製 作 、 調 整 和 重 新 設 計 動 畫 數 據 和 編 輯 數 字 角 色 。<br />

電 腦 硬 體<br />

硬 體 配 備<br />

A 電 腦<br />

B 電 腦<br />

CPU RAM 顯 示 卡<br />

AMD Athlon Dual Core 3.0GB ATI Radeon HD 3200<br />

Processor 4850e<br />

Graphics<br />

AMD Athlon Dual Core 2.0GB NVIDIA GeForce<br />

Processor 5200+<br />

6600LE<br />

硬 體 概 述<br />

由 於 MAYA 對 於 硬 體 設 備 要 求 非 常 高 , 若 電 腦 配 備 沒 有 中 上 程 度 , 使 用<br />

MAYA 各 方 面 都 會 產 生 困 難 ,A 電 腦 顯 示 卡 沒 有 B 電 腦 顯 示 卡 好 , 所 以 在 MAYA<br />

上 跑 動 畫 時 , 很 不 流 暢 ; 而 A 電 腦 的 RAM 比 B 電 腦 多 , 在 物 件 多 寡 上 可 以 比 A<br />

電 腦 多 一 些 , 但 仍 然 稍 嫌 不 足 。<br />

- 5 -


2.2 UNITY 3D 介 紹 :<br />

Unity 是 一 個 用 於 創 建 諸 如 三 維 視 頻 遊 戲 、 建 築 可 視 化 、 實 時 三 維 動 畫 等 類 型<br />

互 動 內 容 的 綜 合 型 創 作 工 具 。 Unity 類 似 於 Director,Blender game<br />

engine, Virtools 或 Torque Game Builder 等 利 用 交 互 的 圖 型 化 開 發 環 境 為 首 要<br />

方 式 的 軟 體<br />

在 正 式 發 布 前 ,Unity 經 歷 的 多 年 的 開 發 階 段 ,Gooball 在 2005 三 月 發 布 , 運 用<br />

了 Unity 的 預 發 售 版 本 開 發<br />

• 2005 六 月 Unity1.0.1 發 布<br />

• 2009 三 月 Unity2.5 加 入 了 對 Windows 的 支 持<br />

• 2009 十 月 Unity2.6 獨 立 版 開 始 免 費<br />

其 編 輯 器 運 行 在 Windows 和 Mac OS X 下 , 可 發 布 遊 戲 至 Windows,Mac,Wii,<br />

或 iPhone 平 台 。 也 可 以 利 用 Unity web player 外 掛 程 式 發 布 網 頁 遊 戲 , 支 持<br />

Mac 和 Windows 的 網 頁 瀏 覽 。 它 的 網 頁 播 放 器 也 被 Mac widgets 所 支 持 。<br />

已 知 用 unity 開 發 的 知 名 遊 戲 有 :Bionicle Glatorian Arena - a single player game<br />

based on the Bionicle Glatorian line of 2009.、Cartoon Network Universe:<br />

FusionFall、Foreign Legion: Buckets of Blood、GooBall、Global Conflicts:<br />

Palestine 、 My Animal Centre 、 Off-Road Velociraptor Safari 、 Venus<br />

Redemption、WolfQuest、Fatale、Tumbledrop<br />

主 要 特 性<br />

1. 層 級 式 的 綜 合 開 發 環 境 , 可 視 化 編 輯 , 詳 細 的 屬 性 編 輯 器 和 動 態 的 遊 戲 預<br />

覽 。Unity 也 被 用 來 快 速 的 製 作 遊 戲 或 者 開 發 遊 戲 原 型 ,<br />

2. 可 開 發 微 軟 Microsoft Windows 和 Mac OS X 的 可 執 行 文 件 , 在 線 內 容 ( 通<br />

過 Unity Web Player 外 掛 程 式 支 持 Internet<br />

Explorer,Firefox,Safari,Mozilla,Netscape,Opera 和 Camino,Mac OS X 的<br />

Dashboard 工 具 ,Wii 程 序 和 Iphone 應 用 程 序 . 開 發 Wii 和 iPhone 需 要 用<br />

戶 購 買 額 外 的 授 權 , 在 價 格 上 不 同<br />

3. 自 動 資 源 導 入 - 項 目 中 的 資 源 會 被 自 動 導 入 , 並 根 據 資 源 的 改 動 自 動 更 新 。<br />

雖 然 很 多 主 流 的 三 維 建 模 軟 體 為 Unity 所 支 持 , 不 過 3ds<br />

Max,Maya,Blender,Cinema 4D, 和 Cheetah3D 可 以 被 更 好 支 持 , 並 支 持 一<br />

些 其 他 的 三 維 格 式<br />

4. 圖 形 引 擎 使 用 的 是 Direct3D(Windows),OpenGL(Mac,Windows) 和 自 有 的<br />

APIs(Wii)<br />

- 6 -


5. 支 持 Bump mapping,Reflection mapping, Parallax mapping, Screen<br />

Space Ambient Occlusion, 動 態 陰 影 使 用 的 是 shadow map 技 術 , 並 支 持<br />

Render-to-texutre 和 全 屏 post processing 效 果 。<br />

6. shaders 編 寫 使 用 ShaderLab 語 言 , 同 時 支 持 自 有 工 作 流 中 的 編 程 方 式 或<br />

Cg.GLSL 語 言 編 寫 的 shader. 一 個 shder 可 以 包 含 眾 多 變 數 及 一 個 參 數 介<br />

面 , 允 許 Unity 去 判 定 參 數 是 否 為 當 前 所 支 持 並 適 配 最 適 合 參 數 , 並 自 己 選<br />

擇 相 應 的 shader 類 型 以 獲 得 廣 大 的 兼 容 性<br />

7. 內 置 對 Nvidia's 的 PhysX physics engine 支 持<br />

8. 遊 戲 腳 本 為 基 於 Mono 的 Mono 腳 本 , 一 個 基 於 .NET Framework 的 開 源 語<br />

言 , 因 此 程 式 設 計 師 可 用 JavaScript. C# 或 Boo 加 以 編 寫<br />

9. The Unity Asset Server - 一 個 支 持 各 種 遊 戲 和 腳 本 的 版 本 控 制 方 案 , 使 用<br />

PostgreSql 作 為 後 端<br />

10. 音 效 系 統 基 於 OpenAL 庫 , 可 以 播 放 Ogg Vorbis 的 壓 縮 音 效<br />

11. 視 頻 播 放 採 用 Theora 編 碼<br />

12. 山 體 和 植 被 引 擎 , 支 持 樹 木 貼 片<br />

2.3 FBX 介 紹 :<br />

由 於 3D 軟 體 的 檔 案 格 式 眾 多 , 如 果 您 需 要 將 不 同 的 檔 案 格 式 從 一 套 軟 體 轉<br />

換 到 另 一 套 軟 體 時 , 您 將 會 發 現 到 檔 案 格 式 受 到 相 當 多 的 限 制 , 這 對 於 一 個 大 型<br />

的 後 製 作 公 司 來 看 , 將 會 在 轉 換 的 過 程 中 耗 費 掉 許 多 時 間 及 預 算 成 本 。 因 此 Alias<br />

提 供 了 免 費 的 FBX 外 掛 程 式 給 市 場 上 所 有 主 流 的 3D 與 後 製 作 軟 體 , 您 可 以 藉<br />

由 她 來 做 為 軟 體 之 間 的 溝 通 橋 樑 , 由 於 您 可 以 輕 易 地 利 用 FBX 來 轉 換 不 同 軟 體<br />

之 間 的 模 型 、 貼 圖 、 動 畫 、 骨 架 、 燈 光 、 攝 影 機 或 聲 音 等 資 料 , 這 對 於 沒 有 R&D<br />

部 門 的 公 司 來 說 , 這 將 是 一 項 整 合 性 的 大 利 多 。<br />

fbx 是 filmbox 這 套 軟 體 所 使 用 的 格 式 , 現 在 改 稱 Motionbuilder。Motionbuilder 是<br />

一 套 專 攻 動 作 製 作 的 軟 體 ( 尤 其 是 配 合 mocap 系 統 ), 詳 細 的 資 料 可 以 查 網 路 上 的<br />

資 訊 , 這 裡 就 點 到 為 止 了 。<br />

Motionbuilder 扮 演 的 是 動 作 製 作 的 平 台 , 所 以 在 前 端 的 modeling 和 後 端 的 rendering<br />

也 都 有 賴 於 其 他 軟 體 的 配 合 , 所 以 Motionbuilder 在 檔 案 的 轉 換 上 自 然 下 了 一 番 功<br />

夫 。<br />

FBX 有 提 供 Quicktime6 的 Plugin, 意 思 就 是 說 只 要 有 安 裝 這 個 插 件 , 就 可 以 直 接<br />

在 Quicktime Player 裡 面 顯 示 FBX 的 模 型 ,Viewport 的 操 作 方 式 和 Motionbuilder<br />

相 同 , 滑 鼠 只 有 左 鍵 有 功 用 。<br />

- 7 -


三 、 程 式 概 述<br />

在 unity3D 軟 體 裡 面 , 我 們 用 的 是 裡 面 內 建 的 編 輯 程 式 , 它 提 供 了 C#,<br />

JavaScript 等 程 式 語 言 , 而 我 們 採 用 的 是 JavaScript, 這 是 我 們 之 前 沒 使 用 過 的 語<br />

言 , 但 一 些 基 本 的 語 法 其 實 都 跟 我 們 之 前 學 過 的 C++ 差 不 多 , 程 式 寫 作 最 困 難 的<br />

地 方 就 是 一 開 始 完 全 不 知 道 該 怎 麼 使 用 unity3D 裡 內 建 的 function, 參 數 要 怎 麼<br />

傳 都 一 概 不 知 , 只 能 用 unity3D 官 方 網 站 裡 面 所 提 供 的 Scripting Overview, 來 一<br />

個 個 慢 慢 查 出 我 所 需 要 功 能 相 對 應 的 function。<br />

最 初 , 我 們 用 網 路 上 的 教 學 影 片 來 慢 慢 認 識 這 個 軟 體 的 使 用 和 程 式 碼 的 寫<br />

作 , 之 後 才 開 始 做 我 們 自 己 想 呈 現 的 東 西 。<br />

以 下 是 一 些 我 們 撰 寫 的 程 式 碼 :<br />

3.1 人 物 的 主 要 部 分 : 程 式 碼 :ThirdPersonController<br />

人 部 份 的 程 式 碼 是 整 個 專 題 中 最 為 複 雜 的 , 光 是 用 在 寫 人 物 的 移 動 、 動 畫 的<br />

控 制 、 各 種 動 作 , 就 需 要 大 量 的 撰 寫 。 大 致 可 分 為 四 個 部 份 , 一 開 始 是 宣 告<br />

將 要 用 到 的 變 數 或 函 數 , 一 部 分 是 動 畫 的 設 置 , 設 定 在 適 當 的 時 機 播 放 出 欲<br />

讓 人 物 動 作 的 動 畫 ; 像 是 按 住 SHIFT 就 能 跑 步 , 平 時 不 動 時 會 變 成 idle 狀 態 ,<br />

一 部 分 就 是 最 重 要 的 移 動 功 能 , 設 定 輸 入 上 下 左 右 能 夠 控 制 人 物 的 前 進 後 退<br />

和 轉 向 ,function UpdateSmoothedMovementDirection () 此 function 就 包 含 了 所<br />

有 移 動 的 控 制 , 包 括 了 判 定 前 進 後 退 , 是 否 是 著 地 的 狀 態 , 跑 步 跳 躍 和 走 路<br />

速 度 等 等 。 一 部 分 就 是 function Update() 這 function 表 示 著 是 隨 時 都 在 更 新<br />

的 , 上 述 的 移 動 功 能 會 因 為 人 物 隨 時 在 走 動 而 改 變 參 數 , 依 照 人 物 現 在 的 狀<br />

況 來 做 更 新 動 作 。 還 有 一 部 分 是 比 較 特 別 的 , 是 為 了 修 改 我 們 當 初 碰 到 的 一<br />

個 問 題 ; 我 們 發 現 把 人 物 送 上 電 梯 後 , 到 達 某 一 高 度 或 是 任 意 上 下 時 , 人 物<br />

會 從 平 台 上 往 下 掉 , 這 讓 我 們 思 考 了 很 久 , 問 題 就 出 在 當 人 物 上 電 梯 後 , 電<br />

梯 平 台 雖 然 是 在 上 升 , 但 人 物 的 座 標 確 沒 跟 著 改 變 , 因 此 我 們 加 入 了 一 些 程<br />

式 碼 , 讓 人 物 的 移 動 和 電 梯 的 上 下 是 同 步 的 , 才 解 決 了 這 部 份 的 bug。<br />

3.2 電 梯 :<br />

3.2.1 電 梯 : 升 降 台 部 份 程 式 碼 :elevator<br />

電 梯 部 分 的 程 式 碼 比 較 瑣 碎 , 但 是 也 比 較 簡 單 , 我 用 function Update() 來 做<br />

移 動 平 台 的 停 止 , 用 的 是 IF 判 定 句 和 TAG 標 籤 來 標 示 當 電 梯 到 達 最 高 點 ,<br />

則 TAG 設 為 Finish, 當 平 台 的 TAG 被 設 定 成 Finish 時 , 就 判 定 他 停 止 。<br />

if( targetA.gameObject.tag == "Finish" )<br />

- 8 -


{<br />

onelevator = false ;<br />

// onelevator 設 為 fals 則 停 止 移 動<br />

targetA.gameObject.tag = "Untagged"; // targetA 是 指 移 動 平 台<br />

// 當 停 止 後 將 TAG 設 為 初 值<br />

}<br />

判 定 電 梯 到 達 最 高 點 , 是 使 用 一 個 觸 發 器 , 當 電 梯 平 台 觸 碰 到 觸 發 器 , 則 電<br />

梯 的 TAG 被 改 變 。function FixedUpdate () 也 是 隨 著 時 間 不 斷 的 執 行 的<br />

function, 用 來 給 電 梯 移 動 的 速 度 , 當 onelevator == true 時 才 會 讓 電 梯 有 速 度 。<br />

3.2.2 電 梯 : 用 來 控 制 電 梯 停 住<br />

程 式 碼 :trigger up down<br />

解 說 如 3.2.1 , 我 們 使 用 Trigger( 觸 發 器 ) 來 停 止 電 梯 , function<br />

OnCollisionEnter(collision : Collision) 此 function 用 來 判 別 是 否 有 東 西 撞 擊 到<br />

該 物 件 , 若 有 則 將 電 梯 TAG 改 成 Finish 讓 它 停 止 。<br />

3.2.3 電 梯 : 按 鈕 控 制 ( 下 ) 程 式 碼 :Text buttons Down<br />

我 們 在 電 梯 裡 做 了 兩 個 按 鈕 , 用 來 控 制 電 梯 的 上 和 下 , 當 滑 鼠 移 到 按 鈕 上 面<br />

時 , 按 鈕 顏 色 會 改 變 。 用 function OnMouseUp() 來 判 定 使 用 者 是 否 點 擊 了 按<br />

鈕 , 用 OnMouseUp() 而 不 是 OnMouseDown() 是 為 避 免 使 用 著 點 擊 按 鈕 不 放<br />

恐 造 成 錯 誤 。 當 使 用 著 點 擊 後 , 會 更 改 電 梯 的 TAG 成 up or down 來 促 使 上<br />

述 elevator 之 程 式 碼 讓 電 梯 移 動 。<br />

3.3 視 窗 功 能 程 式 碼 :Window1<br />

這 是 我 們 用 來 和 標 示 牌 對 話 的 功 能 , 我 們 能 點 擊 在 某 些 教 室 外 面 的 標 示<br />

牌 , 會 跳 出 一 個 視 窗 來 為 我 們 解 說 此 教 室 的 內 容 。<br />

3.4 拖 曳 剛 體 ( 門 ) 程 式 碼 : DragRigidbody<br />

此 功 能 讓 我 們 可 以 做 出 有 如 真 實 的 門 , 用 滑 鼠 按 住 並 且 拖 曳 就 可 以 達 成 把<br />

剛 體 任 意 拖 拉 的 效 果 。 程 式 碼 部 分 是 參 考 UNITY3D 的 Scripting Overview。<br />

3.5 順 移 程 式 碼 程 式 碼 :Domywindow<br />

此 部 分 的 程 式 碼 是 包 含 在 ThirdPersonController 程 式 碼 裡 面 , 此 工 能 提<br />

供 了 一 個 功 能 視 窗 , 標 示 了 電 梯 的 移 動 狀 態 和 許 多 按 鈕 , 按 鈕 上 面 標 示 著<br />

各 個 ST 教 室 的 名 稱 , 當 我 們 想 直 接 移 動 到 某 地 點 , 可 以 點 擊 按 鈕 直 接 讓 腳<br />

色 移 動 到 該 位 置 , 讓 導 覽 功 能 更 快 速 和 方 便 。<br />

Transform.position = Vector3(-314, 51, 140);<br />

- 9 -


Transform.position 表 示 著 人 物 的 三 維 座 標 。<br />

3.6 影 子 程 式 碼 程 式 碼 :BlobShadowController<br />

此 程 式 碼 用 來 控 制 影 子 的 部 份 讓 projector 能 確 實 的 將 貼 圖 投 影 出 來 , 由 於<br />

真 實 的 影 子 判 定 需 要 用 到 PRO 的 軟 體 , 所 以 我 們 用 模 擬 的 方 式 做 一 類 似 影<br />

子 的 效 果 。<br />

- 10 -


四 、 專 題 實 作<br />

建 模 : 建 模 方 面 我 們 主 要 是 在 MAYA 程 式 下 建 模 , 因 為 他 在 建 造 模 型 的 性 能<br />

比 3DMAX 簡 單 而 且 容 易 操 作 , 相 較 於 UNITY3D 也 有 更 多 的 物 件 可 以 讓 模 型 呈<br />

現 更 完 整 的 樣 式 。<br />

4.1 建 模<br />

ST 大 樓 三 樓 和 四 樓 , 首 先 建 構 建 築 大 概 , 參 見 附 圖 一<br />

( 附 圖 一 )<br />

- 11 -


依 各 個 房 間 的 需 求 作 挖 門 的 動 作 , 要 先 做 出 所 需 門 的 大 小 CUBE<br />

Mesh->Boolean->Difference<br />

最 後 架 入 欄 杆<br />

( 附 圖 二 )<br />

( 附 圖 三 )<br />

- 12 -


課 桌 椅 :<br />

( 附 圖 四 )<br />

( 附 圖 五 )<br />

- 13 -


器 材 : 櫃 子<br />

器 材 : 冷 氣 機<br />

( 附 圖 六 )<br />

( 附 圖 七 )<br />

- 14 -


器 材 :PC<br />

( 附 圖 八 )<br />

人 物 : 頭<br />

( 附 圖 九 )<br />

- 15 -


人 物 : 上 半 身<br />

人 物 : 下 半 身<br />

( 附 圖 十 )<br />

( 附 圖 十 一 )<br />

- 16 -


4.2. 匯 入 :<br />

步 驟 1. , 將 轉 檔 類 型 調 出 來 , 預 設 狀 態 下 fbx 是 被 隱 藏 的 , 可 選 擇 load 或 連 auto<br />

一 起 選 ,auto 表 示 下 次 開 啟 maya 會 自 動 被 調 出 , 不 用 在 手 動 load 一 次 。<br />

步 驟 2. 可 選 擇 export all 表 示 該 場 景 中 的 所 有 物 件 都 導 出 成 fbx 檔 , 或 是<br />

export selection 導 出 選 取 物 件 , 該 選 項 必 須 先 選 中 場 景 中 的 任 一 想 導 出 的 單<br />

一 或 多 個 物 件 。<br />

FBX<br />

貼 圖 : 這 個 部 份 開 始 就 把 操 作 平 台 轉 換 到 UNITY3D, 因 為 在 MAYA 先 把 圖<br />

片 貼 好 再 進 行 匯 入 的 動 作 的 話 會 造 成 圖 片 位 移 甚 至 錯 位 。<br />

4.3 貼 圖 :<br />

首 先 要 新 增 一 個 材 質 球 (Material), 加 入 所 需 要 的 材 質 色 彩 , 然 後 選 擇 材 質 ( 金<br />

屬 、 木 頭 …etc), 可 以 調 整 圖 案 的 重 覆 度 與 顏 色 , 最 後 把 設 定 完 成 的 材 質 求<br />

拖 曳 至 預 賦 予 材 質 的 物 件 。<br />

Ex: 玻 璃 :<br />

( 附 圖 十 二 )<br />

- 17 -


( 附 圖 十 三 )<br />

- 18 -


4.4 程 式 碼 給 定<br />

( 附 圖 十 四 )<br />

- 19 -


4.5 完 成 圖 :<br />

( 附 圖 十 五 )<br />

( 附 圖 十 六 )<br />

- 20 -


五 、 總 結 :<br />

5.1 實 作 問 題 :<br />

在 製 作 MAYA 建 模 與 UNITY3D 遊 戲 控 制 的 過 程 中 , 從 學 習 操 作 軟 體 到 完 成<br />

作 品 , 所 遭 遇 到 的 困 難 不 勝 枚 舉 , 以 下 就 列 出 較 為 重 要 的 幾 點 :<br />

1. 國 內 教 學 資 源 太 少 , 雖 然 國 內 對 動 畫 製 作 的 意 識 漸 漸 抬 頭 , 畢 竟 和 先 進<br />

國 家 仍 有 一 段 距 離 , 因 此 在 國 內 的 書 籍 與 網 頁 資 源 為 數 不 多 , 為 了 解 決 資 源 不 足<br />

的 問 題 , 我 們 先 借 閱 圖 書 館 內 的 書 籍 , 將 MAYA 的 基 本 功 能 大 致 了 解 熟 悉 後 ,<br />

進 而 利 用 教 學 影 片 學 習 相 關 技 巧 , 也 在 網 路 平 台 找 尋 與 學 習 更 多 的 方 法 , 而<br />

UNITY3D 國 內 目 前 只 有 一 本 中 文 教 學 書 至 逢 甲 大 學 接 來 研 讀 之 後 , 接 下 來 我 們<br />

用 網 路 上 的 教 學 影 片 來 慢 慢 認 識 這 個 軟 體 的 使 用 和 程 式 碼 的 寫 作 , 最 後 才 能 著 手<br />

做 我 們 自 己 想 呈 現 的 東 西 。<br />

2. 精 緻 模 型 難 以 塑 成 , 需 要 高 度 的 美 術 能 力 與 強 烈 的 3D 概 念 , 精 緻 的 人 物<br />

模 型 就 須 具 備 以 上 的 能 力 , 然 而 我 們 只 有 基 礎 的 技 巧 並 且 還 在 學 習 , 所 以 精 緻 的<br />

人 物 模 型 是 用 網 路 上 的 資 源 , 其 他 較 簡 單 的 物 件 則 是 學 生 以 所 學 得 技 巧 完 成 的 。<br />

3. 內 建 編 輯 程 式 語 言 與 所 學 的 不 同 , 內 建 的 程 式 語 言 有 許 多 種 ,EX:C#、<br />

Javascript、XML, 我 們 所 選 用 的 是 Javascript 做 為 編 輯 , 卻 因 為 之 前 沒 接 觸 過 所<br />

以 造 成 學 習 上 的 困 擾 , 僅 能 利 用 UNITY 官 網 上 的 Scripting Overview 來 查 詢 所 許<br />

要 用 到 的 指 令 名 稱 以 及 其 意 義 。<br />

4. 物 件 占 用 資 源 容 易 過 於 龐 大 , 製 作 3D 動 畫 需 要 高 檔 的 硬 體 配 備 , 對 我 們<br />

的 配 備 而 言 , 製 作 高 品 質 的 動 畫 並 不 容 易 達 成 。 製 作 過 程 中 , 常 會 發 生 記 憶 體 不<br />

足 或 錯 誤 的 現 象 ,CPU 的 使 用 率 也 會 隨 著 模 型 的 細 緻 度 上 升 , 造 成 畫 面 停 格 或<br />

工 作 不 流 暢 的 狀 況 。 這 樣 的 情 形 , 都 會 增 加 製 作 動 畫 的 困 難 度 。<br />

由 於 教 室 課 桌 椅 模 組 眾 多 , 因 而 產 生 許 多 物 件 , 造 成 檔 案 的 龐 大 , 所 以 在 有<br />

限 的 資 源 內 用 較 少 的 指 令 完 成 這 些 模 型 , 便 能 減 少 資 源 的 浪 費 。<br />

隨 著 大 智 慧 科 技 大 樓 3.4 樓 逐 漸 成 型 , 我 們 發 現 製 作 過 程 中 ,MAYA 會 將 使<br />

用 者 所 操 作 過 的 指 令 儲 存 在 記 憶 體 和 檔 案 內 , 如 此 一 來 就 便 會 浪 費 硬 體 資 源 。 會<br />

因 為 歷 史 紀 錄 沒 有 刪 除 而 造 成 匯 入 時 的 錯 誤 , 所 以 在 MAYA 中 都 一 指 令 可 以 清<br />

除 歷 史 紀 錄 , 這 個 的 動 作 能 稍 微 解 決 作 業 流 暢 度 與 匯 入 錯 誤 的 問 題 , 但 這 無 法 根<br />

除 基 本 的 問 題 , 因 為 做 動 畫 所 需 的 硬 體 資 源 需 求 本 身 就 很 高 。<br />

- 21 -


5.2 專 題 心 得 - 張 通 傑 :<br />

首 先 要 謝 謝 林 祝 興 老 師 接 下 我 們 這 組 專 題 生 , 在 我 們 模 糊 不 清 的 時 候 適 時 的<br />

給 我 們 指 引 明 確 的 方 向 , 讓 我 們 可 以 更 快 的 找 到 目 標 並 步 上 軌 道 , 每 一 次 的 專 題<br />

報 告 都 會 給 我 們 適 當 的 小 叮 嚀 和 方 向 錯 誤 的 指 正 , 也 要 感 謝 專 題 指 導 學 姐 的 幫<br />

助 , 由 於 我 們 使 用 的 UNITY3D 軟 體 在 國 內 的 教 學 資 源 偏 少 , 所 以 常 麻 煩 他 幫 我<br />

們 找 國 外 的 教 學 資 料 , 也 常 常 提 醒 我 們 甚 麼 東 西 應 該 要 補 充 或 修 正 。<br />

在 這 次 的 專 題 中 我 主 要 是 負 責 建 造 模 型 的 部 分 , 所 以 主 要 是 專 攻 MAYA2011 軟<br />

體 , 一 開 始 到 圖 書 館 借 書 時 以 為 學 習 一 個 新 的 軟 體 很 簡 單 , 卻 發 現 沒 有 想 像 中 的<br />

簡 單 , 除 了 要 了 解 每 一 個 功 能 鍵 的 用 處 之 外 , 對 於 三 維 空 建 的 概 念 也 要 非 常 明<br />

確 , 而 切 MAYA 對 於 一 個 新 手 來 說 並 沒 有 很 容 易 上 手 , 所 以 剛 凱 史 的 學 習 是 蠻<br />

坎 坷 的 , 教 學 資 源 看 多 了 也 對 於 MAYA 也 漸 漸 上 手 之 後 , 才 慢 慢 可 以 做 出 完 整<br />

的 物 件 , 但 是 卻 發 生 了 物 件 佔 用 資 源 過 大 的 問 題 , 接 著 就 是 盡 量 以 較 少 的 步 驟 完<br />

成 物 件 , 為 了 要 求 整 個 遊 戲 系 統 的 流 暢 度 , 要 怎 麼 把 物 件 佔 用 資 源 縮 減 卻 又 不 失<br />

整 體 的 完 整 性 , 在 這 裡 又 是 一 個 複 雜 的 課 題 , 匯 入 UNITY3D 之 後 就 是 跟 林 容 暄<br />

一 起 討 論 各 個 物 件 該 如 何 擺 放 以 及 其 顏 色 , 動 作 特 效 與 真 實 度 也 都 有 參 與 討 論 ,<br />

使 這 個 專 題 可 以 更 加 的 完 整 。<br />

在 這 一 年 的 的 專 題 研 究 讓 我 學 到 了 許 多 東 西 , 不 論 是 技 術 或 是 團 隊 合 作 的 默<br />

契 , 技 術 方 面 或 與 沒 有 學 習 得 非 常 的 精 通 , 未 來 還 有 很 多 的 空 間 可 以 學 習 , 希 望<br />

可 以 把 MAYA 與 UNITY3D 兩 套 系 統 更 加 的 研 究 並 練 習 , 而 經 過 這 次 的 專 題 與<br />

專 題 夥 伴 林 容 暄 有 更 好 的 默 契 。<br />

5.3 專 題 心 得 - 林 容 暄 :<br />

起 初 開 始 知 道 要 做 專 題 的 時 候 還 沒 有 任 何 的 想 法 , 林 祝 興 教 授 讓 我 們 有 自 由<br />

選 擇 題 目 的 空 間 , 這 讓 我 想 到 了 之 前 學 長 做 的 3D 校 園 導 覽 , 我 對 3D 動 畫 設 計<br />

十 分 的 有 興 趣 , 雖 然 知 道 這 不 是 以 往 資 訊 系 會 做 的 東 西 , 但 還 是 決 定 走 動 畫 設 計<br />

來 當 我 們 的 專 題 題 目 , 一 開 始 我 們 接 續 學 長 使 用 的 MAYA 來 做 摸 索 , 由 於 學 長<br />

們 沒 有 設 計 人 物 在 校 園 裡 面 走 動 , 而 是 用 攝 影 機 並 設 定 路 線 來 導 覽 , 所 以 我 們 打<br />

算 讓 導 覽 系 統 更 具 自 由 度 , 因 此 有 了 目 標 跟 方 向 。 起 初 花 了 很 多 時 間 在 學 習<br />

MAYA, 但 要 建 出 一 個 很 真 實 的 人 物 是 非 常 有 難 度 的 , 而 且 MAYA 是 個 注 重 於<br />

建 模 的 軟 體 , 對 於 人 物 的 控 制 和 很 多 的 導 覽 功 能 我 們 不 知 道 該 如 何 從 MAYA 做<br />

起 , 於 是 , 我 們 找 到 了 一 個 新 的 軟 體 :UNITY3D, 這 是 個 強 大 的 軟 體 能 匯 入 當 前<br />

兩 大 3D 軟 體 MAYA 和 3DSMAX 做 出 來 的 模 型 , 接 著 我 們 就 開 始 著 手 學 習 使 用<br />

UNITY3D。<br />

我 負 責 的 項 目 就 是 UNITY3D 的 程 式 碼 寫 作 , 用 了 之 前 完 全 沒 接 觸 過 的<br />

JavaScript 程 式 語 言 來 撰 寫 ,UNITY3D 裡 面 提 供 了 龐 大 又 複 雜 的 function 來 使<br />

- 22 -


用 , 然 而 有 關 於 此 軟 體 的 資 源 又 相 當 少 , 我 們 也 借 了 中 文 書 來 參 考 , 我 花 了 相 當<br />

長 的 時 間 來 找 尋 與 應 用 到 底 有 哪 些 function 可 以 使 用 , 最 後 完 成 我 想 要 提 供 給 使<br />

用 者 導 覽 的 功 能 並 符 合 真 實 生 活 的 功 能 。 程 式 碼 的 寫 作 讓 我 更 了 解 了 另 一 個 語 言<br />

的 使 用 , 而 且 讓 我 更 明 白 程 式 存 在 的 重 要 性 , 每 一 個 小 細 節 都 須 要 程 式 碼 來 控<br />

制 。 專 題 的 製 作 也 讓 我 清 楚 跟 夥 伴 合 作 的 重 要 性 , 一 個 人 是 無 法 完 成 這 麼 多 事 情<br />

的 , 所 以 跟 組 員 的 分 工 合 作 就 十 分 重 要 , 也 感 謝 學 姐 提 供 的 許 多 幫 助 讓 此 專 題 能<br />

夠 順 利 完 成 。<br />

5.4 展 望<br />

在 UNITY 裡 面 完 成 的 許 多 程 式 , 由 於 知 識 和 技 術 的 不 足 有 些 都 還 只 是 半 成 品<br />

的 水 準 而 已 , 而 後 希 望 可 以 繼 續 研 讀 國 外 的 教 學 資 料 , 把 半 成 品 的 部 分 的 程 式 碼<br />

都 可 以 加 以 改 進 並 完 成 , 而 在 貼 圖 方 面 可 以 嘗 試 更 多 的 材 質 球 跟 顏 料 , 希 望 可<br />

以 配 出 更 真 實 的 色 彩 , 在 MAYA 建 模 的 方 面 , 由 於 這 部 分 需 要 較 多 的 美 工 技 巧<br />

與 3D 成 像 的 概 念 , 所 以 需 要 在 多 方 面 研 讀 美 術 書 籍 以 提 升 自 己 的 美 術 概 念 及 3D<br />

成 像 的 技 術 , 還 需 要 多 閱 讀 MAYA 教 學 的 進 階 書 以 增 進 建 模 計 巧 , 而 後 有 機 會<br />

將 會 把 這 個 專 題 繼 續 的 研 究 並 完 成 。<br />

- 23 -


六 、 參 考 文 獻 :<br />

UNITY3D 官 方 網 站 :http://unity3d.com/<br />

UNITY3D 問 答 http://answers.unity3d.com/<br />

UNITY3D Wiki http://www.unifycommunity.com/wiki/index.php?title=Main_Page<br />

我 的 MAYA 輕 鬆 學<br />

臺 北 市 / 網 奕 資 訊 科 技 /2006[ 民 95] 陳 偉 介<br />

Maya 動 畫 設 計 實 例 洪 振 偉 / 旗 標 2004<br />

3ds max 進 入 3ds max 夢 想 世 界 臺 北 市 / 文 魁 資 訊 /2007[ 民 96] 黃 清 永<br />

3ds Max 2008 動 畫 製 作 實 戰 演 練 臺 北 縣 三 重 市 / 加 樺 國 際 /2008.01<br />

MAYA 8 創 作 講 堂 : 建 模 . 材 質 . 燈 光 . 動 畫<br />

臺 北 市 / 文 魁 資 訊 出 版 /2007/ 松 崗 總 代 理 蔡 哲 明<br />

- 24 -


附 件 一 . 人 物 的 主 要 部 分 程 式 碼 :ThirdPersonController<br />

@script AddComponentMenu ("ThirdPersonController")<br />

// Require a character controller to be attached to the same game object<br />

@script RequireComponent(CharacterController)<br />

var runaudio : AudioClip;<br />

var windowRect : Rect ;<br />

var Elevator :GameObject ;<br />

var other : GameObject;<br />

//var ParticleEmitter.emit = false;<br />

var target1 : GameObject;<br />

public var radarObject : GameObject;<br />

public var idleAnimation : AnimationClip;<br />

public var walkAnimation : AnimationClip;<br />

public var runAnimation : AnimationClip;<br />

public var jumpPoseAnimation : AnimationClip;<br />

public var walkMaxAnimationSpeed : float = 0.75;<br />

public var trotMaxAnimationSpeed : float = 1.0;<br />

public var runMaxAnimationSpeed : float = 1.0;<br />

public var jumpAnimationSpeed : float = 1.15;<br />

public var landAnimationSpeed : float = 1.0;<br />

private var _animation;<br />

//Moving Platform support<br />

private var activePlatform : Transform;<br />

private var activeLocalPlatformPoint : Vector3;<br />

private var activeGlobalPlatformPoint : Vector3;<br />

private var lastPlatformVelocity : Vector3;<br />

enum CharacterState {<br />

Idle = 0,<br />

- 25 -


}<br />

Walking = 1,<br />

Trotting = 2,<br />

Running = 3,<br />

Jumping = 4,<br />

private var _characterState : CharacterState;<br />

// The speed when walking<br />

var walkSpeed = 2.0;<br />

// after trotAfterSeconds of walking we trot with trotSpeed<br />

var trotSpeed = 4.0;<br />

// when pressing "Fire3" button (cmd) we start running<br />

var runSpeed = 6.0;<br />

var inAirControlAcceleration = 3.0;<br />

// How high do we jump when pressing jump and letting go immediately<br />

var jumpHeight = 0.5;<br />

// The gravity for the character<br />

var gravity = 20.0;<br />

// The gravity in controlled descent mode<br />

var speedSmoothing = 10.0;<br />

var rotateSpeed = 500.0;<br />

var trotAfterSeconds = 3.0;<br />

var canJump = true;<br />

private var jumpRepeatTime = 0.05;<br />

private var jumpTimeout = 0.15;<br />

private var groundedTimeout = 0.25;<br />

// The camera doesnt start following the target immediately but waits for a split<br />

second to avoid too much waving around.<br />

private var lockCameraTimer = 0.0;<br />

// The current move direction in x-z<br />

- 26 -


private var moveDirection = Vector3.zero;<br />

// The current vertical speed<br />

private var verticalSpeed = 0.0;<br />

// The current x-z move speed<br />

private var moveSpeed = 0.0;<br />

// The last collision flags returned from controller.Move<br />

private var collisionFlags : CollisionFlags;<br />

// Are we jumping? (Initiated with jump button and not grounded yet)<br />

private var jumping = false;<br />

private var jumpingReachedApex = false;<br />

// Are we moving backwards (This locks the camera to not do a 180 degree spin)<br />

private var movingBack = false;<br />

// Is the user pressing any keys?<br />

private var isMoving = false;<br />

// When did the user start walking (Used for going into trot after a while)<br />

private var walkTimeStart = 0.0;<br />

// Last time the jump button was clicked down<br />

private var lastJumpButtonTime = -10.0;<br />

// Last time we performed a jump<br />

private var lastJumpTime = -1.0;<br />

// the height we jumped from (Used to determine for how long to apply extra jump<br />

power after jumping.)<br />

private var lastJumpStartHeight = 0.0;<br />

private var inAirVelocity = Vector3.zero;<br />

private var lastGroundedTime = 0.0;<br />

var isControllable:boolean = true;<br />

function Awake ()<br />

- 27 -


{<br />

moveDirection = transform.TransformDirection(Vector3.forward);<br />

_animation = GetComponent(Animation);<br />

if(!_animation)<br />

Debug.Log("The character you would like to control doesn't have<br />

animations. Moving her might look weird.");<br />

/*<br />

public var idleAnimation : AnimationClip;<br />

public var walkAnimation : AnimationClip;<br />

public var runAnimation : AnimationClip;<br />

public var jumpPoseAnimation : AnimationClip;<br />

*/<br />

if(!idleAnimation) {<br />

_animation = null;<br />

Debug.Log("No idle animation found. Turning off animations.");<br />

}<br />

if(!walkAnimation) {<br />

_animation = null;<br />

Debug.Log("No walk animation found. Turning off animations.");<br />

}<br />

if(!runAnimation) {<br />

_animation = null;<br />

Debug.Log("No run animation found. Turning off animations.");<br />

}<br />

if(!jumpPoseAnimation && canJump) {<br />

_animation = null;<br />

Debug.Log("No jump animation found and the character has canJump<br />

enabled. Turning off animations.");<br />

}<br />

}<br />

- 28 -


function UpdateSmoothedMovementDirection ()<br />

{<br />

var cameraTransform = Camera.main.transform;<br />

var grounded = IsGrounded();<br />

// Forward vector relative to the camera along the x-z plane<br />

var forward = cameraTransform.TransformDirection(Vector3.forward);<br />

forward.y = 0;<br />

forward = forward.normalized;<br />

// Right vector relative to the camera<br />

// Always orthogonal to the forward vector<br />

var right = Vector3(forward.z, 0, -forward.x);<br />

var v =Input.GetAxisRaw("Vertical");<br />

var h =Input.GetAxisRaw("Horizontal");<br />

/*<br />

if ( (v!=0) | (h!=0) | ( animation.IsPlaying("run") ) )<br />

{<br />

// Debug.Log("1");<br />

SendMessage("OnFootStrike", SendMessageOptions.DontRequireReceiver);<br />

}<br />

*/<br />

/*if ( | (Input.GetButton("Vertical")) |<br />

(Input.GetButton("Horizontal")) )<br />

{<br />

Debug.Log("1");<br />

SendMessage("OnFootStrike", SendMessageOptions.DontRequireReceiver);<br />

}<br />

*/<br />

- 29 -


Are we moving backwards or looking backwards<br />

if (v < -0.2)<br />

movingBack = true;<br />

else<br />

movingBack = false;<br />

var wasMoving = isMoving;<br />

isMoving = Mathf.Abs (h) > 0.1 || Mathf.Abs (v) > 0.1;<br />

// Target direction relative to the camera<br />

var targetDirection = h * right + v * forward;<br />

// Grounded controls<br />

if (grounded)<br />

{<br />

// Lock camera for short period when transitioning moving & standing still<br />

lockCameraTimer += Time.deltaTime;<br />

if (isMoving != wasMoving)<br />

lockCameraTimer = 0.0;<br />

// We store speed and direction seperately,<br />

// so that when the character stands still we still have a valid forward<br />

direction<br />

// moveDirection is always normalized, and we only update it if there is<br />

user input.<br />

if (targetDirection != Vector3.zero)<br />

{<br />

// If we are really slow, just snap to the target direction<br />

if (moveSpeed < walkSpeed * 0.9 && grounded)<br />

{<br />

moveDirection = targetDirection.normalized;<br />

}<br />

// Otherwise smoothly turn towards it<br />

else<br />

{<br />

moveDirection = Vector3.RotateTowards(moveDirection,<br />

- 30 -


targetDirection, rotateSpeed * Mathf.Deg2Rad * Time.deltaTime, 1000);<br />

}<br />

}<br />

moveDirection = moveDirection.normalized;<br />

// Smooth the speed based on the current target direction<br />

var curSmooth = speedSmoothing * Time.deltaTime;<br />

// Choose target speed<br />

//* We want to support analog input but make sure you cant walk faster<br />

diagonally than just forward or sideways<br />

var targetSpeed = Mathf.Min(targetDirection.magnitude, 1.0);<br />

_characterState = CharacterState.Idle;<br />

// Pick speed modifier<br />

if (Input.GetKey (KeyCode.LeftShift) | Input.GetKey<br />

(KeyCode.RightShift))<br />

{<br />

//transform.tag = "move" ;<br />

//target1.audio.Play();<br />

other.particleEmitter.emit = true;<br />

targetSpeed *= runSpeed;<br />

_characterState = CharacterState.Running;<br />

}<br />

else if (Time.time - trotAfterSeconds > walkTimeStart)<br />

{<br />

//target1.audio.Stop();<br />

}<br />

else<br />

{<br />

other.particleEmitter.emit = false;<br />

targetSpeed *= trotSpeed;<br />

_characterState = CharacterState.Trotting;<br />

targetSpeed *= walkSpeed;<br />

_characterState = CharacterState.Walking;<br />

- 31 -


}<br />

moveSpeed = Mathf.Lerp(moveSpeed, targetSpeed, curSmooth);<br />

// Reset walk time start when we slow down<br />

if (moveSpeed < walkSpeed * 0.3)<br />

walkTimeStart = Time.time;<br />

}<br />

// In air controls<br />

else<br />

{<br />

other.particleEmitter.emit = true;<br />

// Lock camera while in air<br />

if (jumping)<br />

lockCameraTimer = 0.0;<br />

if (isMoving)<br />

inAirControlAcceleration;<br />

inAirVelocity += targetDirection.normalized * Time.deltaTime *<br />

}<br />

}<br />

function ApplyJumping ()<br />

{<br />

// Prevent jumping too fast after each other<br />

if (lastJumpTime + jumpRepeatTime > Time.time)<br />

return;<br />

- 32 -


if (IsGrounded()) {<br />

// Jump<br />

// - Only when pressing the button down<br />

// - With a timeout so you can press the button slightly before landing<br />

if (canJump && Time.time < lastJumpButtonTime + jumpTimeout) {<br />

verticalSpeed = CalculateJumpVerticalSpeed (jumpHeight);<br />

SendMessage("DidJump",<br />

SendMessageOptions.DontRequireReceiver);<br />

}<br />

}<br />

}<br />

function ApplyGravity ()<br />

{<br />

if (isControllable) // don't move player at all if not controllable.<br />

{<br />

// Apply gravity<br />

var jumpButton = Input.GetButton("Jump");<br />

// When we reach the apex of the jump we send out a message<br />

if (jumping && !jumpingReachedApex && verticalSpeed


{<br />

}<br />

// From the jump height and gravity we deduce the upwards speed<br />

// for the character to reach at the apex.<br />

return Mathf.Sqrt(2 * targetJumpHeight * gravity);<br />

function DidJump ()<br />

{<br />

other.particleEmitter.emit = true;<br />

jumping = true;<br />

jumpingReachedApex = false;<br />

lastJumpTime = Time.time;<br />

lastJumpStartHeight = transform.position.y;<br />

lastJumpButtonTime = -10;<br />

_characterState = CharacterState.Jumping;<br />

}<br />

function OnGUI() {<br />

// Register the window. Notice the 3rd parameter<br />

windowRect = Rect(10 , 10 , 130 , 200 );<br />

windowRect = GUI.Window (0, windowRect, DoMyWindow, "Where To GO?");<br />

}<br />

// Make the contents of the window<br />

function DoMyWindow (windowID : int) {<br />

- 34 -


if (Elevator.gameObject.tag== "up" )<br />

{<br />

GUI.Label (Rect (10,100,200,50), " Going Up...");<br />

}<br />

if (Elevator.gameObject.tag== "down" )<br />

{<br />

GUI.Label (Rect (10,100,200,50), " Going Down...");<br />

}<br />

if (GUI.Button (Rect (20,20,90,20), "Elevator"))<br />

{<br />

transform.position = Vector3(-314, 51, 140); // 電 梯 位 址<br />

}<br />

if (GUI.Button (Rect (20,40,90,20), "Office"))<br />

{<br />

transform.position = Vector3(-88, 51, 214); // 系 辦<br />

}<br />

if (GUI.Button (Rect (20,60,90,20), "Class338"))<br />

{<br />

transform.position = Vector3(-275, 51 ,194); //338<br />

}<br />

if (GUI.Button (Rect (20,80,90,20),"Labtory"))<br />

{<br />

transform.position = Vector3(-390, 51, 137); // 實 驗 室<br />

}<br />

if (GUI.Button (Rect (20,160,90,20),"Reset"))<br />

{<br />

- 35 -


Application.LoadLevel(0);<br />

}<br />

//reset<br />

//Application.LoadLevel(0);<br />

}<br />

}<br />

function OnEnable()<br />

{<br />

if(radarObject != null)<br />

{<br />

radarObject.SetActiveRecursively(true);<br />

}<br />

function Update()<br />

{<br />

- 36 -


if (Input.GetButtonDown ("Jump"))<br />

{<br />

//target1.audio.Pause();<br />

lastJumpButtonTime = Time.time;<br />

other.particleEmitter.emit = true;<br />

}<br />

UpdateSmoothedMovementDirection();<br />

// Apply gravity<br />

// - extra power jump modifies gravity<br />

// - controlledDescent mode modifies gravity<br />

ApplyGravity ();<br />

// Apply jumping logic<br />

ApplyJumping ();<br />

// Moving platform support<br />

if (activePlatform != null) {<br />

var newGlobalPlatformPoint =<br />

activePlatform.TransformPoint(activeLocalPlatformPoint);<br />

var moveDistance = (newGlobalPlatformPoint -<br />

activeGlobalPlatformPoint);<br />

transform.position = transform.position + moveDistance;<br />

lastPlatformVelocity = (newGlobalPlatformPoint -<br />

activeGlobalPlatformPoint) / Time.deltaTime;<br />

} else {<br />

lastPlatformVelocity = Vector3.zero;<br />

}<br />

- 37 -


Save lastPosition for velocity calculation.<br />

lastPosition = transform.position;<br />

// Calculate actual motion<br />

var movement = moveDirection * moveSpeed + Vector3 (0, verticalSpeed, 0) +<br />

inAirVelocity;<br />

movement *= Time.deltaTime;<br />

// Move the controller<br />

var controller : CharacterController = GetComponent(CharacterController);<br />

collisionFlags = controller.Move(movement);<br />

// ANIMATION sector<br />

if(_animation) {<br />

if(_characterState == CharacterState.Jumping)<br />

{<br />

if(!jumpingReachedApex) {<br />

_animation[jumpPoseAnimation.name].speed =<br />

jumpAnimationSpeed;<br />

_animation[jumpPoseAnimation.name].wrapMode =<br />

WrapMode.ClampForever;<br />

_animation.CrossFade(jumpPoseAnimation.name);<br />

} else {<br />

_animation[jumpPoseAnimation.name].speed =<br />

-landAnimationSpeed;<br />

_animation[jumpPoseAnimation.name].wrapMode =<br />

WrapMode.ClampForever;<br />

- 38 -


_animation.CrossFade(jumpPoseAnimation.name);<br />

}<br />

else<br />

{<br />

}<br />

if(controller.velocity.sqrMagnitude < 0.1) {<br />

_animation.CrossFade(idleAnimation.name);<br />

}<br />

else<br />

{<br />

if(_characterState == CharacterState.Running) {<br />

_animation[runAnimation.name].speed =<br />

Mathf.Clamp(controller.velocity.magnitude, 0.0, runMaxAnimationSpeed);<br />

_animation.CrossFade(runAnimation.name);<br />

}<br />

else if(_characterState == CharacterState.Trotting) {<br />

_animation[walkAnimation.name].speed =<br />

Mathf.Clamp(controller.velocity.magnitude, 0.0, trotMaxAnimationSpeed);<br />

_animation.CrossFade(walkAnimation.name);<br />

}<br />

//target1.audio.Play();<br />

else if(_characterState == CharacterState.Walking) {<br />

_animation[walkAnimation.name].speed =<br />

Mathf.Clamp(controller.velocity.magnitude, 0.0, walkMaxAnimationSpeed);<br />

_animation.CrossFade(walkAnimation.name);<br />

}<br />

}<br />

- 39 -


}<br />

}<br />

// ANIMATION sector<br />

/*<br />

if( Input.GetButton("Vertical"))<br />

{<br />

target1.audio.PlayOneShot(runaudio);<br />

}<br />

//else{<br />

//audio.Pause() ;<br />

//}<br />

*/<br />

/* if( (!Input.GetButton("Vertical")) && (!Input.GetButton("Horizontal")) )<br />

{<br />

target1.audio.Play();<br />

}<br />

*/<br />

// Moving platforms support<br />

if (activePlatform != null) {<br />

activeGlobalPlatformPoint = transform.position;<br />

activeLocalPlatformPoint = activePlatform.InverseTransformPoint<br />

(transform.position);<br />

}<br />

- 40 -


Set rotation to the move direction<br />

if (IsGrounded())<br />

{<br />

transform.rotation = Quaternion.LookRotation(moveDirection);<br />

}<br />

else<br />

{<br />

}<br />

var xzMove = movement;<br />

xzMove.y = 0;<br />

if (xzMove.sqrMagnitude > 0.001)<br />

{<br />

transform.rotation = Quaternion.LookRotation(xzMove);<br />

}<br />

// We are in jump mode but just became grounded<br />

if (IsGrounded())<br />

{<br />

lastGroundedTime = Time.time;<br />

inAirVelocity = Vector3.zero;<br />

if (jumping)<br />

{<br />

jumping = false;<br />

SendMessage("DidLand",<br />

SendMessageOptions.DontRequireReceiver);<br />

}<br />

}<br />

other.particleEmitter.emit = true;<br />

}<br />

function OnControllerColliderHit (hit : ControllerColliderHit )<br />

{<br />

//Debug.Log("t");<br />

- 41 -


Debug.DrawRay(hit.point, hit.normal);<br />

if (hit.moveDirection.y > 0.01)<br />

return;<br />

// Make sure we are really standing on a straight platform<br />

// Not on the underside of one and not falling down from it either!<br />

if (hit.moveDirection.y < -0.9 && hit.normal.y > 0.9) {<br />

activePlatform = hit.collider.transform;<br />

}<br />

}<br />

function GetSpeed () {<br />

}<br />

return moveSpeed;<br />

function IsJumping () {<br />

}<br />

return jumping;<br />

function IsGrounded () {<br />

}<br />

return (collisionFlags & CollisionFlags.CollidedBelow) != 0;<br />

function GetDirection () {<br />

}<br />

return moveDirection;<br />

function IsMovingBackwards () {<br />

}<br />

return movingBack;<br />

function GetLockCameraTimer ()<br />

- 42 -


{<br />

}<br />

return lockCameraTimer;<br />

function IsMoving () : boolean<br />

{<br />

return Mathf.Abs(Input.GetAxisRaw("Vertical")) +<br />

Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5;<br />

}<br />

function HasJumpReachedApex ()<br />

{<br />

return jumpingReachedApex;<br />

}<br />

function IsGroundedWithTimeout ()<br />

{<br />

return lastGroundedTime + groundedTimeout > Time.time;<br />

}<br />

function Reset ()<br />

{<br />

gameObject.tag = "Player";<br />

}<br />

- 43 -


附 件 二 . 電 梯 : 升 降 台 部 份 程 式 碼 :elevator<br />

var targetA : GameObject;<br />

var targetB : GameObject;<br />

var attach : GameObject;<br />

var position : Vector3;<br />

var speed : Vector3;<br />

var onelevator = false;<br />

var elevator : AudioClip ;<br />

var elevatorring : AudioClip ;<br />

function Update(){<br />

if( targetA.gameObject.tag == "Finish" )<br />

{<br />

}<br />

onelevator = false ;<br />

targetA.gameObject.tag = "Untagged";<br />

if(targetA.gameObject.tag == "up")<br />

{<br />

onelevator = true ;<br />

speed = Vector3(0,3,0);<br />

}<br />

if( targetA.gameObject.tag == "down" )<br />

{<br />

- 44 -


}<br />

onelevator = true ;<br />

speed = Vector3(0,-3,0);<br />

}<br />

function OnCollisionEnter(collision : Collision)<br />

{<br />

onelevator = false ;<br />

targetA.gameObject.tag = "Finish";<br />

Debug.Log("2");<br />

}<br />

function FixedUpdate () {<br />

if (onelevator)<br />

rigidbody.MovePosition(rigidbody.position + speed<br />

*Time.deltaTime);<br />

}<br />

- 45 -


附 件 三 . 電 梯 : 用 來 控 制 電 梯 停 住 之 程 式 碼 : trigger up down<br />

var Elevator : GameObject;<br />

var Door1:GameObject;<br />

var Door2:GameObject;<br />

function OnCollisionEnter(collision : Collision) {<br />

Elevator.gameObject.tag = "Finish";<br />

}<br />

function OnTriggerEnter (other : Collider) {<br />

Elevator.gameObject.tag = "Finish";<br />

}<br />

- 46 -


附 件 四 . 電 梯 : 按 鈕 控 制 ( 往 下 ) 之 程 式 碼 :Text buttons Down<br />

var elevatorring : AudioClip ;<br />

var Elevator : GameObject ;<br />

var door1 : GameObject;<br />

var door2 : GameObject;<br />

var speed :Vector3;<br />

function OnMouseEnter()<br />

{<br />

renderer.material.color = Color.green ;<br />

}<br />

function OnMouseExit ()<br />

{<br />

renderer.material.color = Color.yellow;<br />

}<br />

function OnMouseUp()<br />

{<br />

if( Elevator.transform.position.y > 66.2)<br />

{<br />

audio.PlayOneShot(elevatorring);<br />

Elevator.gameObject.tag = "down" ;<br />

door1.gameObject.tag = "up";<br />

door2.gameObject.tag = "up";<br />

}<br />

- 47 -


}<br />

function FixedUpdate () {<br />

if (Elevator.gameObject.tag == "up")<br />

{<br />

speed = Vector3(0,3,0);<br />

rigidbody.MovePosition(rigidbody.position + speed<br />

*Time.deltaTime);<br />

}<br />

if (Elevator.gameObject.tag == "down")<br />

{<br />

speed = Vector3(0,-3,0);<br />

rigidbody.MovePosition(rigidbody.position + speed<br />

*Time.deltaTime);<br />

}<br />

}<br />

- 48 -


附 件 五 . 視 窗 功 能 之 程 式 碼 :Window1<br />

var doWindow1 : boolean = false;<br />

var stringToEdit : String = "Hello World\nI've got 2 lines...";<br />

var texture : Texture2D;<br />

var con : GameObject ;<br />

function OnMouseEnter()<br />

{<br />

con.renderer.enabled = true;<br />

}<br />

function OnMouseExit ()<br />

{<br />

con.renderer.enabled = false;<br />

}<br />

function OnMouseUp()<br />

{<br />

doWindow1 = true;<br />

}<br />

function DoWindow1(windowID : int) {<br />

}<br />

function OnGUI () {<br />

if(doWindow1)<br />

{<br />

- 49 -


GUI.Window (1, Rect (400,200,300,150), DoWindow1, "Guide : ");<br />

if( GUI.Button (Rect (620,350, 80,20), "Close!"))<br />

{<br />

doWindow1 = false;<br />

}<br />

GUI.color = Color.cyan ;<br />

GUI.Label (Rect (400,220,300,150), " Here is the office of<br />

Professor Chung-Chi Lin\n The expertise of Professor is\n Image<br />

processing\n Interface technology\n Micro-computer systems\n VLSI<br />

");<br />

}<br />

}<br />

- 50 -


附 件 六 . 拖 曳 剛 體 ( 門 ) 之 程 式 碼 :DragRigidbody<br />

var spring = 50.0;<br />

var damper = 5.0;<br />

var drag = 10.0;<br />

var angularDrag = 5.0;<br />

var distance = 0.2;<br />

var attachToCenterOfMass = false;<br />

private var springJoint : SpringJoint;<br />

function Update ()<br />

{<br />

if (!Input.GetMouseButtonDown (0))<br />

return;<br />

var mainCamera = FindCamera();<br />

var hit : RaycastHit;<br />

if<br />

(!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePositio<br />

n), hit, 100))<br />

return;<br />

if (!hit.rigidbody || hit.rigidbody.isKinematic)<br />

return;<br />

if (!springJoint)<br />

{<br />

var go = new GameObject("Rigidbody dragger");<br />

body = go.AddComponent ("Rigidbody");<br />

springJoint = go.AddComponent ("SpringJoint");<br />

body.isKinematic = true;<br />

}<br />

springJoint.transform.position = hit.point;<br />

if (attachToCenterOfMass)<br />

{<br />

- 51 -


var anchor =<br />

transform.TransformDirection(hit.rigidbody.centerOfMass) +<br />

hit.rigidbody.transform.position;<br />

anchor =<br />

springJoint.transform.InverseTransformPoint(anchor);<br />

springJoint.anchor = anchor;<br />

}<br />

else<br />

{<br />

springJoint.anchor = Vector3.zero;<br />

}<br />

springJoint.spring = spring;<br />

springJoint.damper = damper;<br />

springJoint.maxDistance = distance;<br />

springJoint.connectedBody = hit.rigidbody;<br />

}<br />

StartCoroutine ("DragObject", hit.distance);<br />

function DragObject (distance : float)<br />

{<br />

var oldDrag = springJoint.connectedBody.drag;<br />

var oldAngularDrag = springJoint.connectedBody.angularDrag;<br />

springJoint.connectedBody.drag = drag;<br />

springJoint.connectedBody.angularDrag = angularDrag;<br />

var mainCamera = FindCamera();<br />

while (Input.GetMouseButton (0))<br />

{<br />

var ray = mainCamera.ScreenPointToRay<br />

(Input.mousePosition);<br />

springJoint.transform.position = ray.GetPoint(distance);<br />

yield;<br />

}<br />

if (springJoint.connectedBody)<br />

{<br />

springJoint.connectedBody.drag = oldDrag;<br />

springJoint.connectedBody.angularDrag = oldAngularDrag;<br />

- 52 -


}<br />

}<br />

springJoint.connectedBody = null;<br />

function FindCamera ()<br />

{<br />

if (camera)<br />

return camera;<br />

else<br />

return Camera.main;<br />

- 53 -


附 件 七 .<br />

瞬 間 移 動 按 鈕 之 程 式 碼 :Domywindow<br />

function OnGUI() {<br />

// Register the window. Notice the 3rd parameter<br />

windowRect = Rect(10 , 10 , 130 , 200 );<br />

windowRect = GUI.Window (0, windowRect, DoMyWindow, "Where To GO?");<br />

}<br />

// Make the contents of the window<br />

function DoMyWindow (windowID : int) {<br />

if (Elevator.gameObject.tag== "up" )<br />

{<br />

GUI.Label (Rect (10,100,200,50), " Going Up...");<br />

}<br />

if (Elevator.gameObject.tag== "down" )<br />

{<br />

GUI.Label (Rect (10,100,200,50), " Going Down...");<br />

}<br />

if (GUI.Button (Rect (20,20,90,20), "Elevator"))<br />

{<br />

transform.position = Vector3(-314, 51, 140); // 電 梯 位 址<br />

}<br />

if (GUI.Button (Rect (20,40,90,20), "Office"))<br />

{<br />

transform.position = Vector3(-88, 51, 214); // 系 辦<br />

}<br />

- 54 -


if (GUI.Button (Rect (20,60,90,20), "Class338"))<br />

{<br />

transform.position = Vector3(-275, 51 ,194); //338<br />

}<br />

if (GUI.Button (Rect (20,80,90,20),"Labtory"))<br />

{<br />

transform.position = Vector3(-390, 51, 137); // 實 驗 室<br />

}<br />

if (GUI.Button (Rect (20,160,90,20),"Reset"))<br />

{<br />

Application.LoadLevel(0); //reset<br />

}<br />

//Application.LoadLevel(0);<br />

- 55 -


附 件 八 . 影 子 之 程 式 碼 : BlobShadowController<br />

using UnityEngine;<br />

using System.Collections;<br />

public class BlobShadowController : MonoBehaviour<br />

{<br />

void Update()<br />

{<br />

transform.position = transform.parent.position + Vector3.up<br />

* 8.246965f;<br />

transform.rotation = Quaternion.LookRotation(-Vector3.up,<br />

transform.parent.forward);<br />

}<br />

}<br />

- 56 -

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!