今天在看M_Studio老师的视频学了很多东西,这里想要给自己小结一下

首先,在M_studio的3DRPG课程中编写敌人追击发现玩家的脚本文件,里面我印象比较深刻的两个函数是Transform.LookAtPhysics.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

该直线是否应被靠近此摄像机的其他对象遮挡?

在世界坐标中绘制一条从 startstart + 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自带摄像机和自带灯光的选项,其余的说实话,我还没有用上。

相比较RigAnimation选项卡,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的官方文档,官方文档真好用!