今天在看M_Studio老师的视频学了很多东西,这里想要给自己小结一下
首先,在M_studio的3DRPG课程中编写敌人追击发现玩家的脚本文件,里面我印象比较深刻的两个函数是Transform.LookAt 和Physics.OverlapSphere ,看到这里我就直接去查询Unity的官方文档,了解了这两个方法
Physics.OverlapSphere
public static Collider[] OverlapSphere (Vector3 position, float radius, int layerMask= AllLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
position | 球体的中心。 |
---|
radius | 球体的半径。 | layerMask | Layer mask 定义要在查询中包括哪些碰撞体层。 | queryTriggerInteraction | 指定该查询是否应该命中触发器。 |
在手册中,对此方法这样描述
计算并存储接触球体或位于球体内部的碰撞体。
Collider[] 返回一个数组,其中包含与球体接触或位于球体内部的所有碰撞体。
而在我们的项目中,就是使用Unity手册上带的例子的改变来是实现敌人是否找到玩家的功能
bool FoundPlayer()
{
var colliders = Physics.OverlapSphere(transform.position, sightRadius);
foreach (var target in colliders)
{
if (target.CompareTag("Player"))
{
attackTarget = target.gameObject;
return true;
}
}
attackTarget = null;
return false;
}
Transform.LookAt
这里我写出目前用到的参数和功能,其实还有一个worldUp 的参数
public void LookAt Transform target);
旋转变换,使向前矢量指向 target 的当前位置
我自己的理解就是看向target 的位置
Debug.DrawRay()
我依稀记得我还在视频中看到了一个方法Debug.DrawRay() ,是用来测试用的,我依旧继续查看Unity官方文档,不得不说,官方文档是真的有意思。
首先就是给出这个方法的头
public static void DrawRay (Vector3 start, Vector3 dir, color = Color.white, float duration = 0.0f, bool depthTest = true);
参数 | 描述 |
---|
start | 应作为该射线起始点的世界空间中的点。 | dir | 该射线的方向和长度。 | color | 绘制的直线的颜色。 | duration | 该直线的可见时长(单位为秒)。 | depthTest | 该直线是否应被靠近此摄像机的其他对象遮挡? |
在世界坐标中绘制一条从 start 到 start + dir 的直线。
duration 参数确定在绘制该直线所在的帧之后该直线可见时长。如果持续时间为 0(默认值),则该直线被渲染 1 帧。
如果将 depthTest 设置为 true,则该直线将被此场景中更靠近摄像机的其他对象遮挡。
将在该 Editor 的场景视图中绘制该直线。如果在游戏视图中启用了辅助图标绘图,则在该视图中也将绘制该直线。
官方文档给出了很有用的示例,让我们来了解这个函数
using UnityEngine;
public class Example : MonoBehaviour
{
// Frame update example: Draws a 10 meter long green line from the position for 1 frame.
void Update()
{
Vector3 forward = transform.TransformDirection(Vector3.forward) * 10;
Debug.DrawRay(transform.position, forward, Color.green);
}
}
因为在官方文档中,我又看到了我不懂的方法TransformDirection(Vector3.forward) ,所以我又查询了,这个方法,原来它的作用是把物体方向矢量的本地坐标变为世界坐标,而Vector3.forword 则是方向(0, 0, 1) 就是物体正前方,这个示例最后也就是画了一根射线,从当前的物体,到它正前方10米为止。
我记得我在使用Unity2019.4.31f1c1的时候,它竟然抽风了,我无语了
问题就是我一保存代码控制台就会报错,如下…
nityEditor.Graphs.Edge.WakeUp () (at ) NullReferenceException: Object reference not set to an instance of an object UnityEditor.Graphs.Edge.WakeUp () (at :0) UnityEditor.Graphs.Graph.DoWakeUpEdges (System.Collections.Generic.List1[T] inEdges, System.Collections.Generic.List1[T] ok, System.Collections.Generic.List`1[T] error, System.Boolean inEdgesUsedToBeValid) (at :0) UnityEditor.Graphs.Graph.WakeUpEdges (System.Boolean clearSlotEdges) (at :0) UnityEditor.Graphs.Graph.WakeUp (System.Boolean force) (at :0) UnityEditor.Graphs.Graph.WakeUp () (at :0) UnityEditor.Graphs.Graph.OnEnable () (at :0)
解决方法就是:重启Unity,不过还是偶尔会抽风,幸好影响不大。
时间来到下午,我在研究如何用Unity 导入fbx 文件,因为文件的问题,还有我对Unity 导入fbx 的不熟悉,我好像又花了一个下午,查看Unity官方文档,来查看Untiy导入面板的各种功能、参数的设置,也就是那个Model Import Settings。因为当时遇到了导入物体材质的问题,我就主要在查看Model 选项卡和Materials 选项卡。
在Model 中,我解决了导入的fbx 自带摄像机和自带灯光的选项,其余的说实话,我还没有用上。
相比较Rig 和Animation 选项卡,Materials 选项还是比较好懂的。我也使用了里面的设置,最后成功导入了我的fbx 文件。
下面放Materials 选项卡的基本设置等
属性 | 功能 | |
---|
Material Creation Mode | 定义希望 Unity 如何为模型生成或导入材质。从该下拉菜单中选择 None 时,Inspector 将在此选项卡上隐藏其余设置。 | | | None | 不使用此模型中嵌入的任何材质。改用 Unity 的默认漫射材质。 | | Standard | 导入时,Unity 应用一组默认规则来生成材质。如果要通过脚本来自定义 Unity 生成材质的方式,请改用 Import via MaterialDescription (Experimental) 模式。 | | Import via MaterialDescription (Experimental) | 导入时,Unity 使用 FBX 文件中嵌入的材质描述来生成材质。与先前的导入方法相比,此方法可提供更准确的结果,并且支持更广泛的材质类型,例如 Autodesk 的 Arnold 和 [Physical](https://knowledge.autodesk.com/support/3ds-max/learn-explore/caas/CloudHelp/cloudhelp/2020/ENU/3DSMax-Lighting-Shading/files/GUID-809B9123-21A2-443E-A7A4-0DAB70410B8D-htm.html?st=Physical Material) 以及 Unity 的 HDRP 材质。有关更多信息,请参阅下面的材质描述部分。 | sRGB Albedo Colors | 启用此选项可在伽马空间中使用反照率颜色。默认情况下为旧版导入方法启用了此选项。 对于使用线性颜色空间的项目,请禁用此选项。 如果从 Material Creation Mode 下拉菜单中选择 Import via MaterialDescription (Experimental),则该属性不可用。 | | Location | 定义如何访问材质和纹理。根据选择的这些选项,可以使用不同的属性。 | | | Use Embedded Materials | 将导入的材质保持在导入的资源中。从 Unity 2017.2 版本开始,这是默认选项。 | | Use External Materials (Legacy) | 将导入的材质提取为外部资源。这是旧版的材质处理方式,适用于使用 Unity 2017.1 或早期版本创建的项目。 |
Remapped Materials
新导入操作或对原始资源的更改不会影响提取的材质。如果要从源资源重新导入材质,必须删除 Remapped Materials 列表中对提取的材质的引用。要从该列表中删除某一项,请选择该项,然后按键盘上的 Backspace 键。
Naming
定义材质的命名策略。
属性 | 功能 |
---|
By Base Texture Name | 使用导入材质的漫射纹理名称来命名材质。如果未将漫射纹理分配给材质,Unity 将使用导入材质的名称。 | From Model’s Material | 使用导入材质的名称来命名材质。 | Model Name + Model’s Material | 使用模型文件的名称与导入材质的名称相结合来命名材质。 |
Search
定义 Unity 尝试在使用 Naming 选项定义的名称时查找现有材质的位置。
属性 | 功能 |
---|
Local Materials Folder | 在本地 Materials 子文件夹(即模型文件所在的同一文件夹)中查找现有材质。 | Recursive-Up | 在所有父文件夹(一直向上追溯到 Assets 文件夹)中的所有 Materials 子文件夹中查找现有材质。 | Project-Wide | 在所有 Unity 项目文件夹中查找现有材质。 |
最后今天的总结就到这边吧,打算明天在看一点Animation Controller 的官方文档,官方文档真好用!
Unity 用户手册 (2019.4 LTS) - Unity 手册
|