假期筆記1-6節(jié)
b站麥扣老師的課程:教程鏈接
學習筆記
第一節(jié)
1.創(chuàng)建管線
將項目升級到URP通用渲染管線,在包管理器中搜索Universal RP,安裝后為項目創(chuàng)建渲染管線,如圖

在創(chuàng)建的管線中,在屬性General的Renderer List中可以添加渲染器。
在edit——project settings——Graphics中設置剛才添加的渲染管線,同時在quality中也可以進行添加。
2.添加素材
在尋找素材時,需要注意該素材是否支持當前的渲染管線,在素材的描述中可以查看是否支持
3.為渲染管線適配素材和場景
當將素材放到場景中不能正常顯示時,一般是沒有適配當前的渲染管線。
這個場景素材中已有,可直接安裝升級。

對于人物素材,在edit菜單中

第一個選項是將整個project中的材質都升級到URP,第二個是僅將選中的材質升級到URP。一般是直接全部升
級,升級后場景中的素材可以正常顯示。
第二節(jié)
天空盒
在這個下拉菜單處可以隱藏場景中默認的天空盒

同時,可以在資源商店中尋找合適的天空盒資源導入工程
導入后,還可以調整天空盒的參數(shù)來實現(xiàn)不同的效果。
在windows——rendering——中調出lighting窗口,在lighting的Environment可以
調整默認的天空盒
場景搭建
要先場景中添加物體時,可以直接拖拽到Hierarchy窗口中,這樣物體就會保持初
始的默認位置。
調整角色的影子,在之前建立的渲染管線中進行調整:
Shadows屬性
Max Distance:默認的距離50,也就是在50米遠的范圍內,都進行陰影
的渲染,這個距離是指攝像機可以看到的距離。當場景中的物體較多時,可以減小
該距離,以降低性能的消耗。
Cascade Count: 是指分為幾層幾級來渲染,當模擬真實場景時,遠處的東西會比較
虛,近處的比較實。如分為兩層,可以設置每一層的距離,第一層的為實陰影,第
二層為虛的陰影。
Normal Bias:這個值越低,陰影越實,中間沒有縫隙
Soft Shadows:虛陰影
Lighting屬性中的Shadow ?Resolution,這個值越高,陰影效果越好,同時開銷也
越高。
Quality屬性
Anti Aliasing(MSAA) :抗鋸齒級數(shù)
需要開啟Quality中的HDR,在后期的后處理效果中需要用到。
場景光照設置
調出lighting窗口,新建一個光照設置文件New...


Shadowmask:間接烘焙
Progressive GPU:使用gpu來渲染可以節(jié)省CPU的開銷,調整好參數(shù)后,進行渲染。
在lighting的環(huán)境設置中,環(huán)境光的來源默認是天空盒,場景的渲染會受到環(huán)境光
的影響,也可以進行修改,Color時還可以調整需要的顏色和光照強度。
場景中物體的放置
按住V鍵,再去拖拽物體,物體的坐標中間會有一個矩形,碰到其他平面時,會自
動吸附,這樣就可以很方便的放置物體。
Crtl+shift+F,便捷調整游戲視圖。
第三節(jié)
導入包Poly brush(一個用來編輯地形和場景的工具),安裝后菜單欄中會出現(xiàn)Tools欄,
在里面即可使用Poly brush。
Poly brush
第一個是用來調節(jié)地形高度的工具
先選中地面,點擊該按鈕,正常是向上,按住ctrl后是向下。mirroring是鏡像工
具,可以選擇在某個方向上同時刷兩個對稱的。direction:方向,可以選擇法線方
向等。
第二個是柔化工具,用來將比較堅硬的頂角刷平。
第三個是將當前的物體刷上不同的顏色
但是需要選中的物體的材質是poly brush的材質,在poly brush的shader graph中直
接右鍵創(chuàng)建材質賦給對應物體即可。如果希望某塊場景整個變成某個顏色,直接點
擊Flood。這個功能可以用來規(guī)劃不同的區(qū)域。
第四個是將預制件刷到場景中
需要先將一些預制件放到Current Palette,需要刷哪些,放到Brush loadout中。按
住ctrl鍵再點擊是消除已經刷上的物體。在這個筆刷工具下,有一個選項Hit ? ? ?
Surface is Parent,可以將這個地形上的所有物體自動的整理到這個地形的子集中
第五個是紋理刷工具。
ProBulider
下載導入該插件,用來創(chuàng)建基本的地形,在Tools欄里可以看到(一般下載的插件
都在這里)
點擊三個點,選擇如圖,較為直觀,按住sfift,可查看具體的功能

對于有齒輪的選項,按住Alt再點擊齒輪可進行進一步的設置(調出了shape Tool窗
口)
使用plane來作為基本的地形,后面兩個參數(shù)是使用Probulider的主要原因,可以設
置頂點數(shù)目,數(shù)值越大,場景的細節(jié)越豐富,設置好后點擊build

ProGrids
需要先在項目設置的包管理器中將Enable Preview Packages勾選,然后在包管理器
中才可以搜索到這個包。安裝后在Tools欄打開該工具
ProGrids主要的做法是讓場景中多一些參考線

最下面的三個就是場景當中的參考線,選擇3D時,會顯示立體網格,格子的密度由
第一個數(shù)值決定,角色在移動時,會按照格子移動一個格子的距離。
地形一開始設置的是正方形切割,選中地形,在Probulider窗口中使用

將地形變成為三角形切割,適合Lowpoly風格。
第四節(jié)
打開導航窗口,windows---AI---Navigation。
導航,烘焙地圖
將需要進行烘焙的物體設置為Navigation static類型,這樣才可以被烘焙,并且在設置時不要將地面上的子物體也
設置為Navigation static類型,而是只將地面設置為Navigation static類型。
Navigation窗口下的子窗口
1:Agents,被導航的對象
2:Areas,導航區(qū)域設置
3:Object,可以對選中的物體進行導航相關的設置,可以設置是否可行走
4:Bake,烘焙子窗口,點擊Bake,場景中可通過的部分會被用藍色標識出來。Agent Radius,調整角色的半徑。Max Slope :可通過的最大坡度。Step Height :可通過的樓梯高度
為避免人物和樹木的穿模,可以將樹木所在的區(qū)域設置為不可通行,在層級窗口中直接搜索tree,選中所有的
tree,將其設置為Navigation static類型,然后選擇不可通行即可。
為需要控制的角色添加Nav ?Mesh Agent組件,添加后,選中添加后的角色, 調整其Agent的大小,使其符合人物
的大小。同時還要在NAvigation的Bake窗口中調整為同樣的值。
場景的障礙物(一般是可移動的物體)可以添加Nav Mesh Obstacle組件,可以選擇其形狀(box,Capsule),
該組件的Carve選項表示切割,就是可移動的物體在移動后,切割的區(qū)域仍然存在。
第五節(jié)
代碼控制人物移動
實現(xiàn)的思路是通過事件,讓某個物體通過某個函數(shù)來實現(xiàn),
1,編寫腳本,先來實現(xiàn)事件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//使用事件的引用
[System.Serializable]
//序列化,因為EventVector3不是繼承自MonoBehaviour的,所以需要這個描述,才可以在Unity中顯示出來相應的事件
public class EventVector3 : UnityEvent<Vector3> { }
//EventVector3繼承自UnityEvent,尖括號內寫引用類型(Vector3)
public class MouseManager : MonoBehaviour
{
? ?public EventVector3 OnMouseClicked;
}
2,

NavMeshAgent.destination,這個方向就是讓角色移動到目標點
3,獲取鼠標點擊的目標點,方向是從攝像機的位置發(fā)射一條射線來看其碰撞到了世界坐標的哪個位置,查找手
冊,使用Camera.ScreenPointToRay()方法,還要使用Physics.Raycast()來計算射線碰撞的物體的相關信息。使用
RaycastHit來保存射線碰撞到的物體的信息。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//使用事件的引用
[System.Serializable]
//序列化,因為EventVector3不是繼承自MonoBehaviour的,所以需要這個描述,才可以在Unity中顯示出來相應的事件
public class EventVector3 : UnityEvent<Vector3> { }
//EventVector3繼承自UnityEvent,尖括號內寫引用類型(Vector3)
public class MouseManager : MonoBehaviour
{
? ?RaycastHit hitinfo;//用來保存射線碰撞到的物體的相關信息
? ?public EventVector3 OnMouseClicked;
? ?void Update()
? ?{
? ? ? ?SetCursorTexture();
? ? ? ?MouseControl();
? ?}
? ?void SetCursorTexture()//設置指針的貼圖
? ?{
? ? ? ?Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
? ? ? ?if(Physics.Raycast(ray,out hitinfo))
? ? ? ?{
? ? ? ? ? ?//切換鼠標貼圖
? ? ? ?}
? ?}
? ?void MouseControl()
? ?{
? ? ? ?if(Input.GetMouseButtonDown(0) && hitinfo.collider != null)
? ? ? //鼠標左鍵點擊,但是有可能會點到地圖外面,所以要加上后面的判斷,點擊物體的碰撞體不為空
? ? ? ?{
? ? ? ? ? ?if (hitinfo.collider.gameObject.CompareTag("Ground"))
? ? ? ? ? ? ? ?OnMouseClicked?.Invoke(hitinfo.point);
? ? ? ? ? ?//當前事件不為空的時候使用Invoke執(zhí)行,OnMouseClicked,并且該事件的引用類型為Vector3,Raycast的point為碰撞點
? ? ? ?}
? ?}
}
注意不要忘記將地面的Tag改為Ground。
在角色的Nav Mesh Agent 屬性中,可以修改角色移動的速度以及角速度等,Stopping Distance是角色會移動到
距離指定位置的這個數(shù)值。這個功能適合在攻擊敵人的時候,由于武器有不同的長度,由此可以來控制。
Auto Braking:如果希望角色有一個緩慢停止的過程,則勾選。
第六節(jié)
上一節(jié)的人物控制的方法太過麻煩,使用單例模式會更加簡單
改進控制方法
新建人物控制腳本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;//導航相關的內容需要使用該命名空間
public class PlayerController : MonoBehaviour
{
? ?private NavMeshAgent agent;
? ?void Awake()//自身變量的獲取一般放在Awake中
? ?{
? ? ? ?agent = GetComponent<NavMeshAgent>();
? ?}
? ?void Start()
? ?{
? ? ? ?MouseManager.Instance.OnMouseClicked += MoveToTarget;
? ? ? ?//將MoveToTarget注冊。想要注冊一個方法,必須保持參數(shù)的一致,如在本例中,都只有一個Vector3類型的變量
? ?}
? ?public void MoveToTarget(Vector3 target)
? ?{
? ? ? ?agent.destination = target;
? ?}
? ?//總結:事件在mousemanager中觸發(fā),當點擊地面時,它就會執(zhí)行所有加入到OnMouseClicked的函數(shù)方法;
}
還要修改mousemanager腳本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;//unity自帶的事件
public class MouseManager : MonoBehaviour
{
? ?public static MouseManager Instance;
? ?RaycastHit hitinfo;//用來保存射線碰撞到的物體的相關信息
? ?public event Action<Vector3> OnMouseClicked;//創(chuàng)建了一個事件
? ?//事件就是需要被人注冊使用,
? ?void Awake()//單例模式
? ?{
? ? ? ?if (Instance != null)
? ? ? ? ? ?Destroy(gameObject);
? ? ? ?Instance = this;
? ?}
? ?void Update()
? ?{
? ? ? ?SetCursorTexture();
? ? ? ?MouseControl();
? ?}
? ?void SetCursorTexture()//設置指針的貼圖
? ?{
? ? ? ?Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
? ? ? ?if (Physics.Raycast(ray, out hitinfo))
? ? ? ?{
? ? ? ? ? ?//切換鼠標貼圖
? ? ? ?}
? ?}
? ?void MouseControl()
? ?{
? ? ? ?if (Input.GetMouseButtonDown(0) && hitinfo.collider != null)
? ? ? ?//鼠標左鍵點擊,但是有可能會點到地圖外面,所以要加上后面的判斷,點擊物體的碰撞體不為空
? ? ? ?{
? ? ? ? ? ?if (hitinfo.collider.gameObject.CompareTag("Ground"))
? ? ? ? ? ? ? ?OnMouseClicked?.Invoke(hitinfo.point);
? ? ? ? ? ?//當前事件不為空的時候使用Invoke執(zhí)行,OnMouseClicked,并且該事件的引用類型為Vector3,Raycast的point為碰撞點
? ? ? ?}
? ?}
}
這樣就不需要每次拖拽人物到事件,然后選擇方法了。
鼠標貼圖修改
下面來修改鼠標的貼圖,先導入圖片資源,需要將其類型修改為cursor類型,然后才可用為鼠標貼圖。
代碼中添加兩部分內容
public Texture2D point, doorway, attack, target, arrow;
//定義后在unity中將相應的圖片資源拖拽到開放出來的變量里
//以及上節(jié)沒有寫的函數(shù)(if語句里的內容),切換鼠標貼圖,這里只寫了一個例子
? ? ? ? ? ?switch(hitinfo.collider.gameObject.tag)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?case "Ground":
? ? ? ? ? ? ? ? ? ?Cursor.SetCursor(target, new Vector2(16, 16), CursorMode.Auto);
? ? ? ? ? ? ? ? ? ?//16,16是根據(jù)圖片尺寸來決定的,這里的圖片大小為32
? ? ? ? ? ? ? ? ? ?break;
? ? ? ? ? ?}