版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、在做一個(gè)策略類的 游戲 時(shí), 需要實(shí)現(xiàn)一個(gè)基地的功能, 功能并不是太復(fù)雜, 默認(rèn)只能顯示場(chǎng) 景的一部分,然后通過(guò)場(chǎng)景(地形查看場(chǎng)景中的其他部分(但是攝像機(jī)不能超出地形, 當(dāng)點(diǎn)擊建筑時(shí), 建筑選中并且有選中效果,當(dāng)點(diǎn)擊非建筑時(shí), 選中效果消失!并且可以拖動(dòng) 場(chǎng)景中的建筑到一定地方,因?yàn)闇?zhǔn)確需求還不明確,所以事先做了個(gè)基地的 DEMO !最終效果如下: 第一步:先布局好大體場(chǎng)景界面,如下圖,只有兩個(gè)建筑,一個(gè)平面(用于繪制格 子,因?yàn)闆](méi)有足夠的資源,格子未顯示,另外還有一個(gè)叫 BuildingCamera 的攝像機(jī), 這個(gè)攝像機(jī)非常重要,主要目的是為了讓拖動(dòng)的對(duì)象始終顯示在最上層! 下面我們需要給
2、場(chǎng)景添加一個(gè) Layer , 我們?nèi)∶?Building Layer,如下圖: 添加好層之后,我們需要修改 BuildingCamera 攝像機(jī) 的參數(shù), Layder 設(shè)置為 Building Layer, 需要修改 BuildingCamera 的 Clear Flags 為 Depth Only, Culling Mask 為 Building ,并且要確保 Depth 的值大于 Main Camera 的值,如下圖: 我們給 Plane 添加 SceneGrid.cs 腳本,這個(gè)腳本什么也沒(méi)有,主要是為了方便 PhysisUtils.cs 腳 本檢測(cè) 對(duì)象,如下圖:文章來(lái)自【 狗刨學(xué)
3、習(xí)網(wǎng) 】 SceneGrid.cs 代碼如下:1. using UnityEngine;2. using System.Collections;3.4. public class SceneGrid : MonoBehaviour 5.6. / Use this for initialization7. void Start ( 8.9. 10.11. / Update is called once per frame12. void Update ( 13.14. 15. 復(fù)制代碼接著,我們給建筑對(duì)象(可拖動(dòng)的對(duì)象添加 SceneBuilding.cs 腳本,如下圖: SceneBuildi
4、ng.cs 代碼如下:1. using UnityEngine;2. using System.Collections;3.4. public class SceneBuilding : MonoBehaviour5. 6. public string buildingType;7.8. /9. / 默認(rèn)材質(zhì)10. /11. private Material defaultMaterial;12.13. void Awake(14. 15. this.defaultMaterial = this.gameObject.renderer.sharedMaterial; 16. 17.18. /1
5、9. / 設(shè)置建筑選中 /未選中狀態(tài)20. /21. / If set to true status.22. / Material.23. public void ChangeSelect(bool status, Material material24. 25. if (status26. 27. material.SetTexture("_MainTex", this.defaultMaterial.GetT exture("_MainTex"28. this.gameObject.renderer.sharedMaterials = new Mat
6、erial this.defaultMaterial, material;29. else 30. this.gameObject.renderer.sharedMaterials = new Material this.defaultMaterial;31. 32. 33. 復(fù)制代碼現(xiàn)在我們給前面創(chuàng)建的空對(duì)象 SceneController 掛載腳本 SceneController.cs , 并且按 下圖配置: SceneController 代碼如下:1. using UnityEngine;2. using System.Collections;3.4. public class Sce
7、neController : MonoBehaviour5. 6. / 鼠標(biāo)枚舉7. enum MouseTypeEnum8. 9. LEFT = 010. 11.12. / 拖動(dòng)建筑枚舉13. enum BuildingLayerEnum14. 15. BUILDING = 816. 17.18. / 水平移動(dòng)速度19. /public float horizontalSpeed = 10f; 20.21. / 垂直移動(dòng)速度22. /public float verticalSpeed = 10f;23.24. / 滾輪速度25. /public float mouseScrollSpeed
8、 = 10f; 26.27. / 拖動(dòng)狀態(tài)判斷 X 坐標(biāo)28. /public float moveOffsetX = 1f;29.30. / 拖動(dòng)狀態(tài)判斷 Y 坐標(biāo)31. /public float moveOffsetY = 1f;32.33. / 地形高度偏移值34. /public float terrainOffset = 1f;35.36. / 格子偏移值37. /public float gridOffset = 0.2f;38.40. /public Material lightMaterial;41.42. / 主攝像機(jī)43. /public Camera mainCamer
9、a;44.45. / 拖動(dòng)建筑顯示層46. /public Camera buildingCamera;47.48. / 屏幕頂點(diǎn)信息49. /private Vector3 pointList;50.51. / 鼠標(biāo)狀態(tài)52. /private bool mousePressStatus = false; 53.54. / 鼠標(biāo) X 坐標(biāo)55. /private float mouseX;56.57. / 鼠標(biāo) Y 坐標(biāo)58. /private float mouseY;59.60. / 滾輪數(shù)據(jù)61. /private float mouseScroll;62.63. / 建筑信息65.6
10、6. / 上一次鼠標(biāo) X 坐標(biāo)67. /private float prevMouseX;68.69. / 上一次鼠標(biāo) Y 坐標(biāo)70. /private float prevMouseY;71.72. / 上一次鼠標(biāo)滾輪73. /private float prevMouseScroll;74.75. / 上一次點(diǎn)擊對(duì)象76. /private GameObject prevObject;77.78. / 拖動(dòng)的建筑對(duì)象79. /private GameObject moveObject;80.81. / 移動(dòng)對(duì)象的位置信息82. /private Vector3 movePosition;8
11、3.84. / 移動(dòng)偏移數(shù)據(jù)85. /private Vector3 moveOffset;86.87. void Awake(88. 89. / 初始化屏幕坐標(biāo)信息,用于射線檢測(cè)屏幕是否超出地形之外,個(gè)人能力有限,沒(méi)想到其他的判斷方式,90. this.pointList = new Vector391. 92. new Vector3(0f, 0f, 0f,93. new Vector3(Screen.width, 0f, 0f,94. new Vector3(0f, Screen.height, 0f,95. new Vector3(Screen.width, Screen.height
12、, 0f96. ;97. 98.99. void Update(100. 101. / 按下鼠標(biāo)、軸102. if (Input.GetMouseButtonDown(intMouseTypeEnum.LEFT 103. 104. this.mousePressStatus = true;105.106. / 如果有選中的建筑信息107. if(this.sceneBuilding != null108. 109. / 重置建筑信息為未選中狀態(tài)110. this.sceneBuilding.ChangeSelect(false, null;111. / 重置建筑信息對(duì)象112. this.sc
13、eneBuilding = null;113. 114.115. / 檢測(cè)鼠標(biāo)點(diǎn)擊區(qū)域是否是建筑對(duì)象116. this.sceneBuilding = PhysisUtils.GetTByMousePoint(this.mainCamera;117. / 如果是建筑對(duì)象118. if (this.sceneBuilding != null119. 120. this.prevObject = this.sceneBuilding.gameObject; 121. / 設(shè)置建筑對(duì)象選中效果122. this.sceneBuilding.ChangeSelect(true, this.lightM
14、aterial;123. 124. 125. / 松開(kāi)鼠標(biāo)、軸126. if (Input.GetMouseButtonUp (intMouseTypeEnum.LEFT 127. 128. this.mousePressStatus = false;129. / 銷毀拖動(dòng)對(duì)象130. if(this.moveObject != null131. 132. string gameName = this.moveO;133. Vector3 targetPosition = this.moveObject.transform.position;134.135. Destroy
15、(this.moveObject;136. this.moveObject = null;137.138. SceneGrid sceneGrid = PhysisUtils.GetTByMousePoint(this.mainCamera;139. / 如果未超出放置區(qū)域140. if (sceneGrid != null141. 142. if(this.prevObject != null143. 144. this.prevObject.transform.position = targetPosition;145. 146. 147. 148. 149. / 如果鼠標(biāo)在按住狀態(tài)151
16、. 152. this.mouseX = this.horizontalSpeed * Input.GetAxis ("Mouse X"153. this.mouseY = this.verticalSpeed * Input.GetAxis ("Mouse Y"154. / 當(dāng)超過(guò)一定的偏移坐標(biāo),才視為拖動(dòng)建筑155. if(Mathf.Abs(this.mouseX >= this.moveOffsetX | Mathf.Abs(this.mouseY >= this.moveOffsetY && this.sceneBu
17、ilding != null 156. 157. / 創(chuàng)建一個(gè)新的建筑對(duì)象158. if(this.moveObject = null159. 160. / 設(shè)置建筑信息的屏幕坐標(biāo)161. this.movePosition = this.mainCamera.WorldToScreenPoint(this.sceneBuilding.transform.position; 162. / 設(shè)置建筑信息的坐標(biāo)偏移值163. this.moveOffset = this.sceneBuilding.transform.position - this.mainCamera.ScreenToWorld
18、Point(new Vector3(Input.mousePosition.x, Input.mousePosition.y, this.movePosition.z;164.165. this.moveObject = (GameObjectInstantiate(this.sceneBuilding.gameObject;166. /Building167. this.moveO = this.sceneBuilding.gameO;168. this.moveObject.layer = (intBuildingLayerEnum.BUILDING
19、;169.170. this.moveObject.transform.localPosition = this.sceneBuilding.gameObject.transform.localPosition;171. / 以下代碼根據(jù)設(shè)計(jì)方法不同會(huì)有不同的處理函 數(shù),這兒要清除掉無(wú)用的對(duì)象,保證拖動(dòng)的對(duì)象不接受鼠標(biāo)事件!172. SceneBuilding moveSceneBuilding = this.moveObject.GetComponent(;173. if(moveSceneBuilding != null174. 175. moveSceneBuilding.ChangeS
20、elect(fals e, null;176. Destroy(moveSceneBuilding;177. 178. MeshCollider moveMeshCollider = this.moveObject.GetComponent(;179. if(moveMeshCollider != null Destroy(moveMeshCollider;181. 182. / 如果移動(dòng)攝像機(jī)183. if(this.sceneBuilding = null184. 185. / 檢測(cè)攝像機(jī)是否超出了地形186. if(this.Valid(187. 188. this.prevMouseX
21、 = this.mouseX;189. this.prevMouseY = this.mouseY;190. this.mainCamera.transform.localPosition -= new Vector3(this.mouseX, 0f, this.mouseY * Time.deltaTime;191. else192. / 重置鼠標(biāo)按下?tīng)顟B(tài)193. this.mousePressStatus = false;194. this.mainCamera.transform.localPosition += new Vector3(this.prevMouseX, 0f, this
22、.prevMouseY;195. 196. else197. 198. / 如果移動(dòng)的是建筑199. if(this.moveObject != null201. Vector3 currentMovePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, this.movePosition.z; 202. Vector3 currentWorldPosition = this.mainCamera.ScreenToWorldPoint(currentMovePosition + this.moveOffset;
23、 203.204. / 獲取當(dāng)前點(diǎn)的地形高度信息205. currentWorldPosition.y = Terrain.activeTerrain.SampleHeight(currentWorldPosition + this.terrainOffset; 206.207. currentWorldPosition.x = currentWorldPosition.x - (currentWorldPosition.x % this.gridOffset;208. currentWorldPosition.z = currentWorldPosition.z - (currentWorl
24、dPosition.z % this.gridOffset;209.210. / 設(shè)置對(duì)象跟隨鼠標(biāo)211. this.moveObject.transform.position = currentWorldPosition;212. 213. 214. 215. / 鼠標(biāo)滾輪拉近拉遠(yuǎn)("Mouse ScrollWheel"217. if (this.mouseScroll != 0f218. 219. / 檢測(cè)攝像機(jī)是否超出了地形220. if(this.Valid(221. 222. this.prevMouseScroll = this.mouseScroll;223.
25、 this.mainCamera.transform.localPosition -= new Vector3(0f, mouseScroll, 0f * Time.deltaTime;224. else225. this.mainCamera.transform.localPosition += new Vector3(0f, this.prevMouseScroll, 0f;226. 227. 228.229. this.buildingCamera.transform.localPosition = this.mainCamera.transform.localPosition;230.
26、 231.232. / 驗(yàn)證是個(gè)頂點(diǎn)是否有元件233. /private bool Valid(234. 235. false; if (this.pointList = null | this.pointList.Length = 0 return 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 復(fù)制代碼 / 射線檢測(cè)攝像機(jī)是否超出了地形 foreach (Vector3 rayPoint in pointList Ray ray = Camera.main.ScreenPointToRay(rayPoint; if (
27、!Physics.Raycast (ray, 1000f return false; return true; 上一步中,我們的選中效果使用了外發(fā)光 Shader(Mobhero/RimLight): 1. 2. 3. 4. 5. Shader "Mobhero/RimLight" Properties _MainTex ("Base (RGB", 2D = "white" _Color ("Main Color", Color = (1,1,1,1 _RimColor ("Rim Color", Color = (1, 1, 1, 1 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. _RimWidth ("Rim Width", Float = 0.7 SubShader Pass Lighting Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.c
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人教A版九年級(jí)地理下冊(cè)月考試卷
- 2025年蘇教新版七年級(jí)物理下冊(cè)階段測(cè)試試卷含答案
- 2025年人教版選修3歷史上冊(cè)階段測(cè)試試卷含答案
- 2025年浙科版七年級(jí)物理下冊(cè)階段測(cè)試試卷含答案
- 2025年湘師大新版八年級(jí)生物下冊(cè)階段測(cè)試試卷含答案
- 2025年北師大版八年級(jí)生物上冊(cè)階段測(cè)試試卷含答案
- 2025年浙教版八年級(jí)地理下冊(cè)階段測(cè)試試卷
- 2025年湘教版選修4歷史下冊(cè)月考試卷含答案
- 2025年統(tǒng)編版2024八年級(jí)歷史上冊(cè)月考試卷
- 2025年新科版八年級(jí)地理下冊(cè)月考試卷
- 完整版秸稈炭化成型綜合利用項(xiàng)目可行性研究報(bào)告
- 油氣行業(yè)人才需求預(yù)測(cè)-洞察分析
- 《數(shù)據(jù)采集技術(shù)》課件-Scrapy 框架的基本操作
- 2025年河北省單招語(yǔ)文模擬測(cè)試二(原卷版)
- 高一化學(xué)《活潑的金屬單質(zhì)-鈉》分層練習(xí)含答案解析
- DB34∕T 4010-2021 水利工程外觀質(zhì)量評(píng)定規(guī)程
- 2024年內(nèi)蒙古中考英語(yǔ)試卷五套合卷附答案
- 2024年電工(高級(jí))證考試題庫(kù)及答案
- 三年級(jí)上冊(cè)脫式計(jì)算100題及答案
- 儲(chǔ)能電站火災(zāi)應(yīng)急預(yù)案演練
- 人教版(新插圖)二年級(jí)下冊(cè)數(shù)學(xué) 第4課時(shí)用“進(jìn)一法”和“去尾法”解決簡(jiǎn)單的實(shí)際問(wèn)題 教學(xué)課件
評(píng)論
0/150
提交評(píng)論