3D場景中選取場景中的物體。

楊航最近在學Unity3D

在一些經典的游戲中,需要玩家在一個3D場景中選取場景中的物體。例如《仙劍奇俠傳》,選擇要攻擊的敵人時、為我方角色增加血量、為我方角色添加狀態,通常我們使用鼠標來選擇一個目標物體,當鼠標移動到目標物體上時,目標物體將顯示輪廓線,此時就表示當前物體被選中,我們可以在此基礎上為游戲物體進行一系列的操作。那么,這一功能是如何在Unity3D中實現呢?

首先我們可以將問題分解為兩個子問題:第一,如何確定物體是否被選中;第二,物體被選中后如何清晰地傳達給用戶。

如圖是古劍奇譚和仙劍奇俠傳的戰斗畫面:

1

2

接下來,我們分別來解決這兩個問題。對于第一個問題,我們可以采取射線檢測的方法,即從攝像機向鼠標所在的位置發射射線,如果該射線擊中了游戲場景中的物體,我們就認為該物體被選中了。對于第二個問題,我們需要讓物體的輪廓線顯示出來,這是我們今天著重要研究的地方。在Unity3D中我們可以通過Shader 即著色器來實現更改材質的渲染方法。Unity3D內置了6類著色器,從簡單的VertexLit到復雜的帶有高光的視差凹凸貼圖(Parallax Bumped with Specular),共30個。其中:

1、Normal:適用于不透明的物體

2、Transparent:適用于半透明的物體,透明度由貼圖的alpha通道決定

3、TransparentCutOut:適用于某些部分透明,某些部分不透明的物體

4、Self-Illuminated:適用于需要自發光的物體

5、Reflective:適用于需要反射環境光的物體

6、Lightmapped:適用于需要添加光照貼圖及相應的UV坐標數值

從一般的意義上來說,著色器定義了渲染物體的方法、材質中指定的貼圖、用于渲染的頂點及片段著色程序、材質中調整的顏色以及各種數值設定。而相對應地,材質決定我們將使用那些貼圖來渲染、使用哪些顏色渲染等。在今天的文章中,我們將定義下面的著色器代碼:

8

3

4

5

6

7

?對于著色器程序的編寫,我們此時可以先放在一邊,這里我們著重來學習如何使用著色器來實現不同的渲染效果。我們新建一個材質,將該材質的著色器設置為我們這里編寫的著色器,如圖:

9

注意到這里的物體時沒有輪廓線的,因為我們這里使用的是默認材質Default-Diffuse。那么,接下來,我們通過編程的方式來動態更換材質,這樣就可以實現不同的渲染效果,編寫下面的腳本:

11

12

? ?在上面的這段腳本中,首先我們指定了三個材質,分別是適用于簡單物體(Cube等)的帶輪廓線的材質,適用于復雜物體(如人物模型)的帶輪廓線的材質(?本文未實現)、適用于簡單物體的默認材質。主要原理就是我們在文章開頭就提到過的射線檢驗方法。我們將這個腳本綁定到游戲場景中的物體上,設置好tag后就可以運行程序了,我們一起來看看程序的效果吧!

13

這就是我們今天想要實現的效果啦,通過今天的文章我們可以實現在3D場景中對一個物體的選取,這種需求在游戲里還是比較多的啊!希望大家好好學習并加以應用!



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

xpath之string(.)方法

from lxml import etreehtml <li class"tag_1">需要的內容1<a>需要的內容2</a></li> selector etree.HTML(html ) contents selector.xpath ( //li[class "tag_1"]) contents1 selector.xpath ( //li[class "tag…

循環語句

循環語句&#xff1a; 當我們要做一些重復的操作時&#xff0c;首先想到的是有沒有一種循環的語句&#xff1f; 答案當然有 Java提供了三種循環&#xff1a; for循環&#xff0c;在Java5中引入了一種主要用于數組的增強型for循環。while循環do……while循環for循環語法1&#x…

canva怎么使用_使用Canva進行數據可視化項目的4個主要好處

canva怎么使用(Notes: All opinions are my own. I am not affiliated with Canva in any way)(注意&#xff1a;所有觀點均為我自己。我與Canva毫無關系) Canva is a very popular design platform that I thought I would never use to create the deliverable for a Data V…

如何利用Shader來渲染游戲中的3D角色

楊航最近在學Unity3D&#xfeff;&#xfeff; 本文主要介紹一下如何利用Shader來渲染游戲中的3D角色&#xff0c;以及如何利用Unity提供的Surface Shader來書寫自定義Shader。 一、從Shader開始 1、通過Assets->Create->Shader來創建一個默認的Shader&#xff0c;并取名…

深入bind

今天來聊聊bind 關于之前的call跟apply 查看此鏈接 我們要明確4點內容 1. bind之后返回一個函數 let obj {name : skr } function fn(){console.log(this) } let bindfn fn.bind(obj) console.log(typeof bindfn) // function 2.bind改變this 并且可以傳參 bind之后的函數仍…

Css單位

尺寸 顏色 轉載于:https://www.cnblogs.com/jsunny/p/9866679.html

ai驅動數據安全治理_JupyterLab中的AI驅動的代碼完成

ai驅動數據安全治理As a data scientist, you almost surely use a form of Jupyter Notebooks. Hopefully, you have moved over to the goodness of JupyterLab with its integrated sidebar, tabs, and more. When it first launched in 2018, JupyterLab was great but fel…

【Android】Retrofit 2.0 的使用

一、概述 Retrofit是Square公司開發的一個類型安全的Java和Android 的REST客戶端庫。來自官網的介紹&#xff1a; A type-safe HTTP client for Android and JavaRest API是一種軟件設計風格&#xff0c;服務器作為資源存放地。客戶端去請求GET,PUT, POST,DELETE資源。并且是無…

一個透明的shader

楊航最近在學Unity3D&#xfeff;&#xfeff;Shader "Custom/xiankuang" { Properties { _LineColor ("Line Color", Color) (1,1,1,1) _GridColor ("Grid Color", Color) (1,1,1,0) _LineWidth ("Line Width", float) 0…

Mysql常用命令(二)

對數據庫的操作 增 create database db1 charset utf8; 查 # 查看當前創建的數據庫 show create database db1; # 查看所有的數據庫 show databases; 改 alter database db1 charset gbk; 刪 drop database db1; 對表的操作 use db1; #切換文件夾select database(); #查看當前所…

python中定義數據結構_Python中的數據結構—簡介

python中定義數據結構You have multiples algorithms, the steps of which require fetching the smallest value in a collection at any given point of time. Values are assigned to variables but are constantly modified, making it impossible for you to remember all…

1206封裝電容在物料可靠性設計比較低

1206封裝電容在物料可靠性設計中是要盡力避免的&#xff0c;盡量選擇0805或1210。在現場中容易出現電容因斷裂而擊穿的情況。同時容易造成保險絲燒斷。轉載于:https://www.cnblogs.com/conglinlixian/p/10414877.html

Java開發中 Double 和 float 不能直接運算

不能直接運算 是因為計算機儲存浮點類型的數值使用指數和尾數來表示 這就意味著計算時會出現“精度缺失”的現象 為了解決這個問題 我們引入 java.math.BigDecimal類來進行精確計算。 具體如下&#xff1a; public class Arith { //加法運算 public static double add(dou…

Unity3D 場景與C# Control進行結合

楊航最近在自學Unity3D&#xff0c;打算使用這個時髦、流行、強大的游戲引擎開發一個三維業務展示系統&#xff0c;不過發現游戲的UI和業務系統的UI還是有一定的差別&#xff0c;很多的用戶還是比較習慣WinForm或者WPF中的UI形式&#xff0c;于是在網上搜了一下WinForm和Unity3…

數據質量提升_合作提高數據質量

數據質量提升Author Vlad Ri?cu?ia is joined for this article by co-authors Wayne Yim and Ayyappan Balasubramanian.作者 Vlad Ri?cu?ia 和合著者 Wayne Yim 和 Ayyappan Balasubramanian 共同撰寫了這篇文章 。 為什么要數據質量&#xff1f; (Why data quality?) …

黑魔法(method-swizzling)解決第三方庫引發的問題

需求 最近做一個項目中&#xff0c;有個需求&#xff0c;所有網絡請求&#xff0c;都不顯示 NetworkActvityIndicator&#xff08;也就是狀態欄里旋轉的小圈圈&#xff09;. 解決過程1&#xff1a; 全局搜索 NetworkIndicator 關鍵字&#xff0c; 把所有涉及 NetworkIndicator …

Python 操作 MySQL 的5種方式(轉)

Python 操作 MySQL 的5種方式 不管你是做數據分析&#xff0c;還是網絡爬蟲&#xff0c;Web 開發、亦或是機器學習&#xff0c;你都離不開要和數據庫打交道&#xff0c;而 MySQL 又是最流行的一種數據庫&#xff0c;這篇文章介紹 Python 操作 MySQL 的5種方式&#xff0c;你可以…

unity3d 人員控制代碼

普通瀏覽復制代碼private var walkSpeed : float 1.0;private var gravity 100.0;private var moveDirection : Vector3 Vector3.zero;private var charController : CharacterController;function Start(){charController GetComponent(CharacterController);animation.w…

刪除wallet里面登機牌_登機牌丟失問題

刪除wallet里面登機牌On a sold-out flight, 100 people line up to board the plane. The first passenger in the line has lost his boarding pass but was allowed in regardless. He takes a random seat. Each subsequent passenger takes their assigned seat if availa…

PHP 備份還原 MySql 數據庫

原生 PHP 備份還原 MySql 數據庫 支持 MySql&#xff0c;PDO 兩種方式備份還原 php5.5 以上的版本建議開啟pdo擴展&#xff0c;使用 pdo 備份還原數據 備份文件夾 db_backup、import/log 文件要有讀寫權限環境版本 本人測試環境 php:5.5.38 /5.6.27-nts/7.0.12-nts; mysql: 5.5…