便捷的快捷键和一些操作
Scene场景的克隆Ctrl+D再改名
修改界面的值可以运行的时候复制,不运行了再paste上去(不止transform可以)
在Inspector面板的右上角找到一个类似三个点(...)的菜单按钮,点击它,然后在弹出的菜单中选择“Debug Mode”,开启Debug模式后,Inspector面板将显示更多的信息,包括脚本中的私有变量等
涉及的知识的深入
Physics.Raycast
函数:
基本功能
射线投射:Physics.Raycast发射一条射线,并检测这条射线是否与场景中的任何碰撞体(Collider)相交。
返回值:如果射线与碰撞体相交,则返回true,否则返回false。
碰撞信息:如果发生相交,Physics.Raycast还提供了一个RaycastHit结构体,该结构体包含了关于相交点的详细信息,如相交点的位置、碰撞体的法线方向、被命中的碰撞体引用等。
|
- Ray ray:一个
Ray
结构体,表示射线的起点和方向。你可以通过new Ray(origin, direction)
来创建一个射线,其中origin
是射线的起点(Vector3类型),direction
是射线的方向(Vector3类型,通常是单位向量)。 - out RaycastHit hitInfo:一个
RaycastHit
结构体,用于存储射线击中的碰撞器的信息。如果射线没有击中任何碰撞器,则此结构体的信息将不会被更新。 - float maxDistance(可选):射线的最大长度。默认值是
Mathf.Infinity
,即无限长。 - int layerMask(可选):一个层掩码,用于指定射线应该检测哪些层上的碰撞器。默认值是
Physics.DefaultRaycastLayers
,即检测所有默认层上的碰撞器。
character controller组件
Character Controller
是一个常用的组件,它简化了角色在复杂地形上的移动控制。与刚体(Rigidbody)和碰撞检测(Collider)相比,Character Controller
提供了一种更直观、更易于控制角色在地形上移动的方法,尤其是当你不需要物理引擎的复杂模拟(如重力、摩擦力等)时。
- 配置Character Controller:
- 在Inspector中,你可以调整
Character Controller
的各种参数,如半径(Radius)、高度(Height)、步高(Step Offset)、坡度限制(Slope Limit)等。 - 半径和高度定义了角色的物理尺寸。
- 步高决定了角色能跨越的最大垂直障碍高度。
- 坡度限制则限制了角色能够攀爬的最大坡度。
- 在Inspector中,你可以调整
- 编写移动代码:
- 你需要编写脚本来控制角色的移动。这通常涉及到监听输入(如键盘、鼠标或游戏手柄)并根据输入调整
Character Controller
的Move
、SimpleMove
或velocity
属性。 SimpleMove
是一个简单的方法,它允许你通过给定一个方向和速度来移动角色,而无需担心方向和速度之间的转换。Move
方法提供了更多的控制,但你需要自己处理方向和速度的计算。
- 你需要编写脚本来控制角色的移动。这通常涉及到监听输入(如键盘、鼠标或游戏手柄)并根据输入调整
Mathf类
在Unity中,Mathf
是一个非常重要的类,它提供了一系列用于数学运算的静态方法。这些方法主要用于处理浮点数(float
)运算,特别是在处理游戏开发中的物理、动画、摄像机移动等场景时非常有用。
- 基本运算:
Mathf.Abs(float f)
: 返回浮点数的绝对值。Mathf.Ceil(float f)
: 返回大于或等于指定浮点数的最小整数。Mathf.Floor(float f)
: 返回小于或等于指定浮点数的最大整数。Mathf.Round(float f)
: 返回最接近指定浮点数的整数。Mathf.RoundToInt(float f)
: 返回最接近指定浮点数的整数,并直接转换为int
类型。
- 三角函数:
Mathf.Sin(float f)
: 返回指定角度(以弧度为单位)的正弦值。Mathf.Cos(float f)
: 返回指定角度(以弧度为单位)的余弦值。Mathf.Tan(float f)
: 返回指定角度(以弧度为单位)的正切值。Mathf.Asin(float f)
: 返回其正弦值等于指定数值的角的弧度值。Mathf.Acos(float f)
: 返回其余弦值等于指定数值的角的弧度值。Mathf.Atan(float f)
: 返回其正切值等于指定数值的角的弧度值。
- 指数和对数:
Mathf.Exp(float f)
: 返回 e 的指定次幂的值。Mathf.Log(float f)
: 返回指定浮点数的自然对数(底数为 e)。Mathf.Log10(float f)
: 返回指定浮点数的以 10 为底的对数。
- 插值和映射:
Mathf.Lerp(float a, float b, float t)
: 根据时间t
(范围从 0 到 1)在a
和b
之间进行线性插值。Mathf.LerpAngle(float a, float b, float t)
: 类似于Lerp
,但考虑了角度的循环性质(即,它会在 360 度内插值)。Mathf.Clamp(float value, float min, float max)
: 将value
限制在min
和max
之间。Mathf.Clamp01(float value)
: 将value
限制在 0 和 1 之间。
- 其他:
Mathf.Max(params float[] values)
: 返回一系列浮点数的最大值。Mathf.Min(params float[] values)
: 返回一系列浮点数的最小值。Mathf.Pow(float f, float p)
: 返回f
的p
次幂。Mathf.Sqrt(float f)
: 返回指定浮点数的平方根。Mathf.DeltaAngle(float current, float target)
: 返回两个角度之间的最短差值(以度为单位),考虑了角度的循环性质。
在C#中,params
关键字
你可以在调用方法时传递零个或多个指定类型的参数。当使用 params
关键字时,必须将该参数指定为方法中的最后一个参数,并且该参数的类型必须是一维数组。但是,在调用方法时,你不需要显式地创建数组实例;C# 编译器会自动为你处理这一转换
Vector3结构体
- 属性:
x
、y
、z
:分别表示向量在X、Y、Z轴上的分量。magnitude
(只读):向量的长度(模),即向量到原点的距离。sqrMagnitude
(只读):向量的长度的平方,计算起来比magnitude
更快,因为它避免了开方运算。normalized
(只读):向量的单位化版本,即保持方向不变,但长度为1的向量。
- 方法:
Distance(Vector3 a, Vector3 b)
:计算两个点之间的距离。DistanceSquared(Vector3 a, Vector3 b)
:计算两个点之间距离的平方,比Distance
更快,因为避免了开方运算。Lerp(Vector3 a, Vector3 b, float t)
:在点a
和点b
之间按参数t
(范围从0到1)进行线性插值。MoveTowards
(Vector3 current, Vector3 target, float maxDistanceDelta)
:将当前点current
向目标点target
移动,但不超过maxDistanceDelta
的距离。Normalize()
:将向量的长度归一化为1,即单位化向量。Scale(Vector3 scale)
:将向量的每个分量乘以scale
向量的对应分量。Cross(Vector3 lhs, Vector3 rhs)
:计算两个向量的叉积,结果是一个垂直于这两个向量的新向量。
MonoBehaviour类相关
OnMouseOver函数
在Unity中,OnMouseOver 函数是MonoBehaviour类的一个方法,它用于检测当鼠标悬停在Collider(碰撞体)或GUIElement(GUI元素,但在UGUI系统中更常用的是EventSystem和Raycaster来处理)上时的情况。这个函数会在每一帧鼠标悬停在对象上时调用,直到鼠标移开。
以下是关于OnMouseOver函数的详细解释:
调用时机
OnMouseEnter:在鼠标首次进入对象上方的第一帧调用。
OnMouseOver:随后,只要鼠标保持在对象上方,每帧都会调用这个函数。
OnMouseExit:当鼠标从对象上方移开时调用。
使用场景
OnMouseOver函数常用于实现鼠标悬停效果,比如改变对象的颜色、显示提示信息、播放音效等。
以下是一个简单的示例,展示了如何在Unity中使用OnMouseOver函数来改变游戏对象的颜色:
using UnityEngine;
public class OnMouseOverColor : MonoBehaviour
{
// 当鼠标悬停时对象将变为这个颜色(红色)
Color m_MouseOverColor = Color.red;
// 存储对象的原始颜色
Color m_OriginalColor;
// 获取对象的MeshRenderer以访问其材质和颜色
MeshRenderer m_Renderer;
void Start()
{
// 从对象获取MeshRenderer组件
m_Renderer = GetComponent<MeshRenderer>();
// 获取对象的原始颜色
m_OriginalColor = m_Renderer.material.color;
}
void OnMouseOver()
{
// 当鼠标悬停在游戏对象上时,将其颜色更改为红色
m_Renderer.material.color = m_MouseOverColor;
}
void OnMouseExit()
{
// 当鼠标从游戏对象上移开时,将颜色重置为原始颜色
m_Renderer.material.color = m_OriginalColor;
}
}
注意事项
在属于Ignore Raycast层的对象上,不会调用OnMouseOver函数。
当且仅当Physics.queriesHitTriggers为true时,才会在标记为触发器的碰撞体上调用该函数。
OnMouseOver函数可以是一个协程,但在函数内部使用yield语句时需要注意上下文和逻辑的正确性。
总结
OnMouseOver是Unity中用于处理鼠标悬停事件的一个非常有用的函数,通过结合OnMouseEnter和OnMouseExit函数,可以实现丰富的交互效果。开发者可以根据自己的需求,在OnMouseOver函数中编写相应的逻辑来处理鼠标悬停事件。
Texture2D
Texture2D
和JPG
- Texture2D:
Texture2D
是Unity中的一个类,用于表示和处理二维纹理图像。- 它是一个数据结构,可以在代码中直接创建、修改和使用,以用于游戏对象(如3D模型、UI元素等)的表面纹理。
- JPG:
- JPG(也称为JPEG)是一种图像文件格式,由JPEG联合图像专家组定义,用于连续色调静态图像压缩。
- 它是一种经过压缩的有损图片格式,文件后缀名主要是.jpg或.jpeg。
- JPG文件通常用于存储和传输图像数据,但不能直接用于Unity中的纹理处理,除非先被导入到Unity项目中并转换为
Texture2D
或其他纹理类型。
sprite与texture的区别:虽然Sprite基于图像文件(纹理),但Sprite更侧重于图像在游戏场景中的表现方式,包括其位置、大小、旋转等属性,以及如何通过渲染管线将其呈现给玩家。而纹理则更多地是指图像数据本身,以及这些数据如何被应用到物体表面上。
Texture2D和Texture3D
- Texture2D:
- Texture2D是二维纹理,主要用于2D游戏或UI界面中的图像显示。
- 它是一张二维的图片,可以覆盖在网格(Meshes)、粒子(Particles)或UI元素上,为其提供视觉上的细节和外观。
- 在Unity中,Texture2D通常用于Sprite的制作,以及UI元素(如按钮、图标等)的显示。
- Texture3D(虽然通常不直接提及Texture3D,但可以从Texture的扩展理解其特性):
- Texture3D是三维纹理,理论上它用于存储三维空间中的纹理数据,但在Unity的标准用法中,更常见的是使用Texture2D配合其他技术(如法线贴图、高度图等)来模拟3D效果。
- 然而,Unity并没有直接提供一个名为Texture3D的常规纹理类型用于游戏开发中的常规纹理贴图。相反,对于3D游戏开发,Unity提供了多种支持3D图形渲染和物理模拟的功能,如使用3D模型、材质(Materials)和Shader等。