13.04.2015 Views

東海大學‧資訊工程學系

東海大學‧資訊工程學系

東海大學‧資訊工程學系

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

東 海 大 學<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!