当前位置: 首页 > news >正文

深入了解Unity的Physics类:一份详细的技术指南(七)(下篇)

接着上一篇深入了解Unity的Physics类(上篇),我们继续把Physics类剩余的属性和方法进行讲解


  1. 碰撞检测和忽略:
    (这些方法和属性涉及查询和处理物体之间的碰撞)
    Physics.CheckBox: 检查给定位置的盒子是否与任何碰撞器接触或者位于任何碰撞器内部。
    Physics.CheckCapsule: 检查给定位置的胶囊是否与任何碰撞器接触或者位于任何碰撞器内部。
    Physics.CheckSphere: 检查给定位置的球体是否与任何碰撞器接触或者位于任何碰撞器内部。
    Physics.ClosestPoint: 寻找指定位置最近的点,返回碰撞体表面上最接近给定位置的点。
    Physics.IgnoreCollision: 使物理引擎忽略两个碰撞器之间的所有碰撞。
    Physics.IgnoreLayerCollision: 让物理引擎忽略特定层之间的所有碰撞。
    Physics.GetIgnoreLayerCollision: 检查物理引擎是否忽略特定层之间的所有碰撞。
    Physics.GetIgnoreCollision:检查物理引擎是否忽略特定物体之间的所有碰撞
    Physics.ComputePenetration:用于计算两个重叠碰撞器之间的穿透向量和距离的方法
    Physics.OverlapBox: 返回在给定位置盒子覆盖的所有碰撞器。
    Physics.OverlapBoxNonAlloc:返回在给定位置盒子覆盖的所有碰撞器,但不会分配新的内存来返回碰撞器。将结果填充到一个预先存在的数组中,从而避免了频繁的内存分配和收集,这可以帮助优化性能。
    Physics.OverlapCapsule: 返回在给定位置胶囊覆盖的所有碰撞器。
    Physics.OverlapCapsuleNonAlloc:返回在给定位置胶囊覆盖的所有碰撞器,并将这些碰撞器存放在预定义的数组中。
    Physics.OverlapSphere: 返回在给定位置球体覆盖的所有碰撞器。
    Physics.OverlapSphereNonAlloc:返回在给定位置球体覆盖的所有碰撞器,并将这些碰撞器存放在预定义的数组中。

Physics.CheckBox()

用于检测给定盒子形状区域内是否存在任何碰撞器。这种检测在很多场景中都很有用,比如检查玩家是否位于某个特定的空间内,或者测试放置对象之前的位置是否为空。

 
参数:

  • center:盒子的中心位置。
  • halfExtents:盒子的半尺寸。换句话说,就是从盒子中心到边缘的距离。
  • orientation:(可选参数)盒子的旋转。默认为 Quaternion.identity,这意味着没有旋转。
  • layerMask:(可选参数)用于筛选要进行测试的对象层。默认为-1,这将包括所有层。
  • queryTriggerInteraction:(可选参数)指定如何处理触发器碰撞器。默认为QueryTriggerInteraction.UseGlobal。

返回值:
返回 true,如果在盒子区域内有碰撞器;否则返回 false。

示例:
假设你想要检查一个中心在 (0, 0, 0),尺寸为 (1, 1, 1) 的盒子内是否有任何物体:

Vector3 boxCenter = new Vector3(0, 0, 0);
Vector3 halfExtents = new Vector3(0.5f, 0.5f, 0.5f);
if (Physics.CheckBox(boxCenter, halfExtents))
{Debug.Log("盒子里有东西");
}

Physics.CheckCapsule()

用于检测在指定的胶囊形状区域内是否存在任何碰撞器。胶囊形状可以看作是两个球体与它们之间的柱体组成的形状。这个方法常常用于角色控制器的碰撞检测,因为胶囊形状往往能很好地近似许多游戏角色的形状。

 
参数:

  • point1:胶囊的一个端点。
  • point2:胶囊的另一个端点。
  • radius:胶囊的半径。
  • layerMask:(可选参数)用于筛选要进行测试的对象层。默认为-1,这将包括所有层。
  • queryTriggerInteraction:(可选参数)指定如何处理触发器碰撞器。默认为QueryTriggerInteraction.UseGlobal。

返回值:
返回 true,如果在胶囊区域内有碰撞器;否则返回 false。

示例:
假设你想要检查一个从 (0, 0, 0) 到 (0, 2, 0),半径为 0.5 的胶囊是否有物体:

Vector3 point1 = new Vector3(0, 0, 0);
Vector3 point2 = new Vector3(0, 2, 0);
float radius = 0.5f;
if (Physics.CheckCapsule(point1, point2, radius))
{Debug.Log("胶囊里有东西");
}

Physics.CheckSphere()

这个函数用于检查指定位置的球体是否与任何碰撞器接触或重叠。它常常用于测试一个区域内是否有障碍物,例如在实体放置、玩家移动或对象生成之前。

 
参数:

  • center:球体的中心位置。
  • radius:球体的半径。
  • layerMask (可选):一个LayerMask,允许你筛选与球体进行交互的特定层。默认情况下,这会与所有层进行交互。
  • queryTriggerInteraction(可选):描述如何处理触发器碰撞器。默认为QueryTriggerInteraction.UseGlobal。

返回值:
bool:如果球体与任何碰撞器重叠,则返回 true,否则返回 false。

示例:
假设你想在坐标 (0, 1, 0) 上检查一个半径为 0.5 的球体是否与任何物体重叠:

Vector3 sphereCenter = new Vector3(0, 1, 0);
float sphereRadius = 0.5f;
if (Physics.CheckSphere(sphereCenter, sphereRadius))
{Debug.Log("球体里有东西");
}

Physics.ClosestPoint()

用于找到一个给定碰撞器上与指定点最近的点。这在很多场景中都非常有用,例如在射线追踪、对象交互或距离测量中。

 
参数:

  • Vector3 position:你想要找到其上最近点的碰撞器的位置。
  • Collider collider:碰撞器实例,你想在其上找到最近的点。
  • Vector3 point:一个位置点,你想找到与它最接近的碰撞器上的点。

返回值:
Vector3:表示在碰撞器上与给定点最近的点的位置。

用更直观的方式来解释
假设你手里有一个苹果(这就是我们的Collider或碰撞器)。现在,你想知道,如果你指向这个苹果的某一点,你的手指最终会碰到苹果的哪个部分。这个与你的手指最先接触的部分就是ClosestPoint 即最近点。

示例:
假设我们有一个场景,其中包含一个球形角色(使用球形碰撞器)和一个可以移动的指针。当指针接近这个球形角色时,我们想要在球上显示一个小的标记,以指示哪个部分是距离指针最近的。

    public Transform sphere; // 球形角色的Transformpublic Transform pointer; // 指针的Transformpublic GameObject marker; // 标记物体,可以是一个小球或其他指示器private Collider sphereCollider;void Start(){// 获取球形角色的碰撞器sphereCollider = sphere.GetComponent<Collider>();}void Update(){// 使用Physics.ClosestPoint()获取与指针最近的球面上的点Vector3 closestPoint = Physics.ClosestPoint(pointer.position, sphereCollider, sphere.position, sphere.rotation);// 将标记设置为那个点的位置marker.transform.position = closestPoint;}

在这个代码中,当指针移动时,标记(marker)会在球形角色上移动,以始终指向与指针最接近的部分。这是使用 Physics.ClosestPoint() 为游戏添加视觉效果或用户反馈的一个简单示例。


Physics.IgnoreCollision

允许你设置两个碰撞器是否应该忽略之间的所有碰撞

 
参数:

  • collider1: 第一个碰撞器。
  • collider2: 第二个碰撞器。
  • ignore: 如果为 true,那么两者之间的碰撞将被忽略。如果为false,则它们之间的碰撞将被启用。默认为 true。

用途:
使用此方法可以控制两个碰撞器之间是否发生物理交互。例如,你可能希望在某些情况下防止玩家与特定对象发生碰撞,或者你可能有两个物体总是相互穿透并且不互相碰撞。

示例:
假设你有一个玩家角色。当玩家获得某种能力时,你希望玩家能够穿越墙壁,而不是与其碰撞。此时,你可以使用 Physics.IgnoreCollision 来达到这个效果:

    public Collider playerCollider;public Collider wallCollider;// 当玩家获得穿越墙壁的能力时调用此方法public void GainWallPassAbility(){// 让玩家和墙壁之间的碰撞被忽略Physics.IgnoreCollision(playerCollider, wallCollider, true);}// 如果玩家失去了穿越墙壁的能力,你可以再次启用碰撞public void LoseWallPassAbility(){Physics.IgnoreCollision(playerCollider, wallCollider, false);}

注意: Physics.IgnoreCollision 只影响物理碰撞检测,而不影响触发器事件。如果两个碰撞器中的一个或两者都有触发器,那么它们之间的交互仍然会生成触发器事件。


Physics.IgnoreLayerCollision

允许你为指定的层之间的碰撞设置一个全局规则,决定它们是否应该相互碰撞。在Unity中,使用层是一种组织和管理游戏对象的方法。通过使用层,你可以轻松地定义哪些对象应与其他对象交互以及如何交互。

 
参数:

  • layer1: 第一个层的索引。
  • layer2: 第二个层的索引。
  • ignore: 如果为 true,那么 layer1 和 layer2 之间的碰撞将被忽略。如果为false,则它们之间的碰撞将被启用。默认为 true。

用途:
此方法非常适用于游戏中的大量对象,这些对象可能需要在某些情境下避免与某些其他对象的碰撞,但在其他情境下又需要与这些对象发生碰撞。

示例:
假设你的游戏中有玩家、敌人和由玩家发射的子弹。你不希望玩家发射的子弹能够打击玩家本身,但希望它能够打击敌人。为此,你可以为玩家设置一个层(例如 “Player”),为子弹设置一个层(例如 “PlayerBullet”),然后使用 Physics.IgnoreLayerCollision 来确保 “Player” 和 “PlayerBullet” 之间不会发生碰撞:

private void Start()
{int playerLayer = LayerMask.NameToLayer("Player");int playerBulletLayer = LayerMask.NameToLayer("PlayerBullet");// 忽略 "Player" 和 "PlayerBullet" 之间的碰撞Physics.IgnoreLayerCollision(playerLayer, playerBulletLayer, true);
}

这意味着当玩家发射子弹时,子弹不会与玩家碰撞,但可以与其他层的对象碰撞,例如敌人。


Physics.GetIgnoreLayerCollision

用于检查两个指定的层之间是否存在碰撞忽略规则的方法。这可以帮助你在运行时动态地查询两个层之间的碰撞设置。

 
参数:

  • layer1: 第一个层的索引。
  • layer2: 第二个层的索引。

返回值:
返回 true:表示这两个层之间的碰撞已经被忽略。
返回 false:表示这两个层之间的碰撞是启用的。

用途:
你可能会在某些时刻需要查询某两个层之间的碰撞状态,例如在调试过程中或在某些游戏逻辑中。此方法允许你在不更改实际设置的情况下检查碰撞忽略状态。

示例:
假设你在一个场景中有两个层:“Player” 和 “Enemy”。你已经为这两个层设置了碰撞忽略规则,但你希望在某个时刻检查这两个层之间的碰撞状态:

void Start()
{int playerLayer = LayerMask.NameToLayer("Player");int enemyLayer = LayerMask.NameToLayer("Enemy");if (Physics.GetIgnoreLayerCollision(playerLayer, enemyLayer)){Debug.Log("“玩家与敌人之间的碰撞被忽略了");}
}

此脚本将会输出当前的碰撞状态,告诉你玩家和敌人之间的碰撞是否被忽略。

Tips:这个方法特别有用于复杂的场景,尤其是当你有多个层和碰撞规则时。它允许你在运行时获得这些层之间的碰撞信息,这对于调试和游戏逻辑都非常有价值。


Physics.GetIgnoreCollision

允许你查询两个特定的碰撞器(colliders)之间是否存在碰撞忽略规则。这是对单独的碰撞器而言的,而不是对整个层。该方法可以帮助你确定是否已经为这两个特定的碰撞器设置了碰撞忽略规则。

 
参数:

  • collider1: 第一个碰撞器。
  • collider2: 第二个碰撞器。

返回值:
返回 true:如果这两个碰撞器之间的碰撞已经被忽略。
返回 false:如果这两个碰撞器之间的碰撞是启用的。

用途:
有时,你可能不希望两个特定的游戏对象发生物理交互(例如,可能是因为它们是团队成员并且不应该相互伤害)。在这种情况下,你可以使用 Physics.IgnoreCollision 设置碰撞忽略规则。之后,你可以使用 Physics.GetIgnoreCollision 检查这两个碰撞器之间是否真的忽略了碰撞。

示例:
假设你有两个游戏对象,“Player” 和 “Teammate”,它们都有碰撞器。你已经设置了为它们之间的碰撞忽略规则,但你希望检查这两个对象之间的碰撞状态:

public Collider playerCollider;
public Collider teammateCollider;void Start()
{if (Physics.GetIgnoreCollision(playerCollider, teammateCollider)){Debug.Log("玩家和队友之间的碰撞被忽略!");}
}

此脚本将检查"Player"和"Teammate"之间的碰撞状态,并输出相关信息。


Physics.ComputePenetration

一个用于计算两个重叠碰撞器之间的穿透向量和距离的方法。当两个物体碰撞器相互穿透时(例如由于快速移动或其他原因),这个函数可以帮助确定这种穿透的大小和方向,从而你可以采取适当的措施来纠正它。

 
参数:

  • colliderA 和 colliderB: 要检查穿透的两个碰撞器。
  • positionA 和 positionB: 碰撞器A和碰撞器B的位置。
  • rotationA 和 rotationB: 碰撞器A和碰撞器B的旋转。
  • direction (输出参数): 如果存在穿透,这将返回穿透的方向。
  • distance (输出参数): 如果存在穿透,这将返回穿透的距离。

返回值:
返回 true:两个碰撞器发生了穿透。
返回 false:两个碰撞器没有发生穿透。

用途:
该方法主要在需要精确控制如何解决碰撞的高级物理模拟或自定义碰撞响应系统中使用。例如,你可能希望在两个对象重叠时以特定的方式将它们推开,而不仅仅是依赖Unity的物理引擎来处理它们。

示例:
假设你有两个游戏对象,“ObjectA” 和 “ObjectB”,它们都有碰撞器。你希望检查并处理它们之间的任何穿透情况:

public Collider colliderA;
public Collider colliderB;void Update()
{Vector3 penetrationDirection;float penetrationDistance;if (Physics.ComputePenetration(colliderA, colliderA.transform.position, colliderA.transform.rotation,colliderB, colliderB.transform.position, colliderB.transform.rotation,out penetrationDirection, out penetrationDistance)){Debug.Log("“渗透检测!");// 您可以根据penetrationDirection和penetrationDistance进行操作// 例如,将对象分开移动。}
}

在这个示例中,如果"colliderA"和"colliderB"碰撞器发生穿透,脚本会输出相关信息,并允许你根据penetrationDirection和penetrationDistance采取适当的措施。


Physics.OverlapBox

一个用于检测与给定的盒型区域重叠的所有碰撞器的方法。它返回一个碰撞器数组,表示与指定的盒子区域相交或重叠的所有物体。

 
参数:

  • center: 指定盒子中心的世界坐标位置。
  • halfExtents: 指定盒子每个方向上的一半的尺寸。因此,盒子的完整尺寸是这个值的两倍。
  • orientation (可选): 定义盒子的旋转。默认值是 Quaternion.identity,这意味着盒子没有旋转。
  • layerMask (可选): 这是一个用于过滤在查询中考虑的对象的层掩码。默认值会考虑所有层。
  • queryTriggerInteraction (可选): 定义触发器如何被考虑在内。默认为QueryTriggerInteraction.UseGlobal,这意味着它会使用全局设置。

返回值:
返回一个 Collider[] 数组,该数组包含与指定盒子相交或重叠的所有物体的碰撞器。

用途:
此方法主要用于检测在给定盒子区域内的物体,例如在射击游戏中检测玩家是否在某个房间内,或在模拟环境中检测某个区域内的所有实体。

示例:
假设你想检查位于(0, 0, 0)处的一个大小为(2, 2, 2)的盒子内的所有碰撞器:

void Start()
{Vector3 boxCenter = new Vector3(0, 0, 0);Vector3 boxHalfSize = new Vector3(1, 1, 1); // 对应盒子的完整尺寸是 2x2x2Collider[] collidersInsideBox = Physics.OverlapBox(boxCenter, boxHalfSize);foreach (Collider col in collidersInsideBox){Debug.Log("物体" + col.name + "“在盒子里!”");}
}

这个示例脚本会列出所有在指定盒子内的物体。你可以将它附加到任何游戏对象上,它会在游戏开始时检查盒子内的物体,并打印出它们的名称。


Physics.OverlapCapsule 和 Physics.OverlapSphere

这两个方法和上面的Physics.OverlapBox类似,也是用于检测与给定的碰撞区域重叠的所有碰撞器的方法,这里就不举例子了,可以参照上面的例子。
  1. 模拟与场景交互:
    (这些方法涉及物理场景的模拟和处理)
    Physics.BakeMesh:允许为一个网格计算碰撞信息
    Physics.RebuildBroadphaseRegions:重新构建其广阶段的碰撞检测区域
    Physics.Simulate:手动进行物理仿真
    Physics.SyncTransforms:同步物理系统中的变换信息与Unity的变换组件的数据。

Physics.BakeMesh

一个相对特殊的方法,它允许你提前为一个网格计算碰撞信息。这在某些特定场景中是非常有用的,特别是当你在运行时动态生成网格并希望用于物理碰撞检测时。

 
功能描述:
Physics.BakeMesh 用于计算一个网格的碰撞数据。当你动态生成一个网格并打算将其用作碰撞体时,可以使用此方法提前计算其碰撞数据,以确保物理模拟的准确性。

参数:

  • meshID: 这是要烘焙的网格的唯一标识符。通常,当你创建一个新的网格或修改现有的网格时,Mesh 类提供的
    GetInstanceID() 方法可以用来获取这个ID。
  • convex:这个布尔值决定了烘焙的碰撞信息是否应该是凸的。凸碰撞体有性能优势,因为它们的碰撞检测更简单,但它们不能表示凹形或有洞的形状。如果此参数设置为true,Unity将尝试为给定的网格生成一个凸的碰撞表示。

使用场景:
当你在运行时动态创建网格,尤其是使用脚本或计算生成的网格,并且希望该网格参与物理碰撞检测,这时你可以使用 Physics.BakeMesh。它确保为这些网格预计算了必要的碰撞数据,从而使碰撞检测更为准确和高效。

示例:
假设你动态创建了一个网格,并且为其分配了一个网格碰撞器:

Mesh myMesh = new Mesh();
// ... 填充网格的顶点、三角形等数据 ...GameObject myObject = new GameObject("DynamicObject");
MeshCollider meshCollider = myObject.AddComponent<MeshCollider>();
meshCollider.sharedMesh = myMesh;// 烘焙网格的碰撞数据
Physics.BakeMesh(myMesh.GetInstanceID(), true);

注意:此方法的主要用途是为网格碰撞器烘焙碰撞数据。如果你不打算动态修改或生成网格,并且在编辑器中已经分配了静态网格,那么通常不需要使用此方法。


Physics.RebuildBroadphaseRegions

一个专用于高级物理模拟优化的方法。它主要与物理引擎的广阶段(broadphase)检测有关,该阶段用于快速确定哪些物体可能会发生碰撞,从而优化进一步的精确碰撞检测。

 
功能描述:
此方法允许你强制物理引擎针对给定的世界范围和子区域数量,重新构建其广阶段的碰撞检测区域。

参数:

  • worldBounds (Bounds):这是一个Bounds结构,代表了你希望物理引擎考虑的世界空间的范围。只有在这个范围内的物体才会被考虑进广阶段的碰撞检测。

  • subdivisions (int): 一个指示你想将worldBounds划分为多少子区域的整数。这可以用来优化广阶段的碰撞检测,特别是当你知道物体在世界中的分布并希望根据该分布来进行优化时。

使用场景:
如果在一个特定的worldBounds范围内有很多物体,并且你希望物理引擎更有效地管理这个范围内的碰撞检测,那么可以使用此方法。通过合理地选择子区域数量,你可以更好地平衡性能和精度。

示例:
假设你有一个游戏世界,其主要活动范围是从(-50, -50, -50)到(50, 50, 50)。在这个范围内有很多物体,你希望将其划分为8个子区域以优化碰撞检测。

Bounds myWorldBounds = new Bounds(Vector3.zero, new Vector3(100, 100, 100));
Physics.RebuildBroadphaseRegions(myWorldBounds, 2); // 2^3 = 8 细分

注意:要谨慎使用这个功能,因为不恰当地设置worldBounds和subdivisions可能会导致不预期的性能问题。此外,如果物体移出了指定的worldBounds,它们可能不会参与碰撞检测。


Physics.Simulate

允许手动进行物理仿真。Unity 的物理系统默认是按照固定时间步(FixedUpdate)来自动进行物理仿真的,但在某些特定情况下,你可能需要在游戏逻辑中手动控制物理仿真的进度。

 
参数:
step (float): 要仿真的时间长度(以秒为单位)。

使用场景:
预览或预测物理效果: 例如,预测一个抛出的物体的着陆点。
非实时仿真: 在后台进行物理计算,例如在策略游戏中模拟多回合的战斗结果。
自定义时间缩放: 在特定情境下,可能需要使物理仿真速度与游戏的主循环速度脱钩。

注意事项:

  • 使用 Physics.Simulate 方法时,必须确保之前调用了 Physics.SyncTransforms
    方法,以确保物理系统与游戏对象的位置和旋转信息同步。
  • 连续调用 Physics.Simulate 而不允许主游戏循环进度可能会导致渲染和游戏逻辑出现延迟或不同步。
    虽然这个方法可以让你控制物理仿真的进度,但频繁地进行小时间步的仿真可能会降低性能。

示例:
假设你想预测一个物体在未来5秒内的移动路径:

float simulationTime = 5.0f;// 先保存物体的当前状态
Vector3 originalPosition = myObject.transform.position;
// 进行仿真
Physics.Simulate(simulationTime);
// 获取仿真后的位置
Vector3 predictedPosition = myObject.transform.position;// 恢复物体的原始状态
myObject.transform.position = originalPosition;

在这个例子中,我们仿真了物体在未来5秒的移动,并获取了它的预测位置,然后我们将其状态恢复为仿真之前的状态。


Physics.SyncTransforms

用于同步物理系统中的变换信息与Unity的变换组件(Transform component)的数据。在大多数情况下,Unity物理系统会自动进行同步,但在某些特定的操作后,比如使用 Physics.Simulate 方法进行手动仿真,你可能需要明确地调用 Physics.SyncTransforms 以确保同步。
 
为何需要同步:
在Unity中,物理模拟与渲染或其它游戏逻辑是分开的。当物体在物理系统中移动时,它的物理表示与在场景中的实际表现(即Transform组件)可能会有所偏差。Physics.SyncTransforms 确保这两者之间的同步。

使用场景:

  1. 如果你使用 Physics.Simulate 进行手动物理仿真,之后通常需要调用 Physics.SyncTransforms
    以确保物理变化正确反映到游戏对象的Transform上。
  2. 物体位置或旋转的快速修改后: 在一短时间内对大量物体进行快速的位置或旋转更改后,调用此方法可以帮助保持物理状态的一致性。

注意事项:
过于频繁地调用此方法可能会导致性能开销,因此建议只在必要的时候使用。

示例:

// 假设我们有一个物体,我们想快速地改变其位置,然后立即进行物理仿真
myObject.transform.position = newPosition;
// 由于我们直接改变了物体的位置,现在同步物理系统的变换信息
Physics.SyncTransforms();
// 现在进行物理仿真,例如预测物体的下一秒位置
Physics.Simulate(1.0f);

在这个例子中,我们首先移动了一个物体,然后调用 Physics.SyncTransforms 来确保物理系统中的变换与Unity的变换组件是同步的,最后进行了物理仿真。


以上就是关于Physics类的所有属性与方法的讲解

注意使用这个类,特别是涉及物理模拟的部分,需要理解物理学的基本原理。如果对物理学的理解不足,可能会遇到预期外的结果。一般来说,尽量避免创建不真实的物理条件(如零摩擦力,无限大的力等)。

相关文章:

深入了解Unity的Physics类:一份详细的技术指南(七)(下篇)

接着上一篇深入了解Unity的Physics类(上篇)&#xff0c;我们继续把Physics类剩余的属性和方法进行讲解 碰撞检测和忽略: (这些方法和属性涉及查询和处理物体之间的碰撞) Physics.CheckBox: 检查给定位置的盒子是否与任何碰撞器接触或者位于任何碰撞器内部。 Physics.CheckCapsu…...

C++入门:引用是什么

目录 1.引用的概念 2.引用的特征 3.常引用 4.引用使用场景 5.传值&#xff0c;传引用效率比较 6.引用与指针的区别 1.引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用…...

2023年人工智能与自动化控制国际学术会议(AIAC 2023)

2023年人工智能与自动化控制国际学术会议&#xff08;AIAC 2023&#xff09; The 2023 International Conference on Artificial Intelligence and Automation Control 2023年人工智能与自动化控制国际学术会议&#xff08;AIAC 2023&#xff09;将于2023年10月27-29日在中…...

分布式核心知识以及常见微服务框架

分布式中的远程调用 在微服务架构中&#xff0c;通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分&#xff1a;序列化和通信协议。常见的序列化协议包括json、xml、 hession、 protobuf、thrift、text、 bytes等&#xff0c;目前主流的远程调用技术有基于HTTP…...

Unity记录4.1-存储-根据关键字加载Tile

文章首发见博客&#xff1a;https://mwhls.top/4810.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 汇总&#xff1a;Unity 记录 摘要&#xff1a;实现完 Tilemap 地图生成后&#xff0c;实现根据关键字…...

数据结构—树表的查找

7.3树表的查找 ​ 当表插入、删除操作频繁时&#xff0c;为维护表的有序表&#xff0c;需要移动表中很多记录。 ​ 改用动态查找表——几种特殊的树 ​ 表结构在查找过程中动态生成 ​ 对于给定值key ​ 若表中存在&#xff0c;则成功返回&#xff1b; ​ 否则&#xff0…...

微信小程序测试策略和注意事项?

一、测试前准备&#xff08;环境搭建&#xff09; 1、前端页面 微信 Web 开发者工具安装、授权测试用的微信号可预览和调试小程序 2、管理后台 配置内网测试服务器环境&#xff0c;通过 PC 端 Web 站点管理小程序前端的输出内容&#xff0c;可从开发人员获取管理账号进行测…...

VUE3封装EL-ELEMENT-PLUS input组件

VUE3封装EL-ELEMENT-PLUS input组件 完整代码 <template><div><div><div class"lable_top" v-if"label"><label :class"lable_sty">{{ label }}</label></div><el-inputv-model"inputValue&…...

RISC-V公测平台发布 · 在SG2042上配置Jupiter+Octave科学计算环境

简介 JupyterHub是一个开源的共享计算平台&#xff0c;它为每个用户管理一个单独的 Jupyter 环境&#xff0c; 可以用于学生班级、企业数据科学小组或科学研究小组。它是一个多用户中心&#xff0c;可以生成、管理和代理多个单用户Jupyter笔记本服务器的实例。 GNU Octave是一…...

初识Sentinel

目录 1.解决雪崩的方式有4种&#xff1a; 1.1.2超时处理&#xff1a; 1.1.3仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制 2.1.簇点链路 …...

【官方中文文档】Mybatis-Spring #注入映射器

注入映射器 与其在数据访问对象&#xff08;DAO&#xff09;中手工编写使用 SqlSessionDaoSupport 或 SqlSessionTemplate 的代码&#xff0c;还不如让 Mybatis-Spring 为你创建一个线程安全的映射器&#xff0c;这样你就可以直接注入到其它的 bean 中了&#xff1a; <bea…...

UG\NX 二次开发 相切面、相邻面的选择控件

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 有群友问“UFUN多选功能过滤面不能选择相切面或相邻面之类的吗?” 这个用Block UI的"面收集器"就可以,ufun函数是不行的。 效果: C++语言在UG二次开发中的应用及综合分析 C++ …...

Quartz任务调度框架介绍和使用

一、Quartz介绍 Quartz [kwɔːts] 是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;完全由Java开发&#xff0c;可以用来执行定时任务&#xff0c;类似于java.util.Timer。但是相较于Timer&#xff0c; Quartz增加了很多功能&#xff1a; 1.持久性作业 …...

drools8尝试

drools7升级到drools8有很大很大的变更.几乎不能说是一个项目了. 或者说就是名字相同的不同项目, 初看下来变化是这样 两个最关键的东西都retired了 https://docs.drools.org/8.42.0.Final/drools-docs/drools/migration-guide/index.html business central变成了一个VS code…...

【机器学习】python基础实现线性回归

手写梯度下降的实现ykxb的线性回归 算法步骤&#xff1a; &#xff08;1&#xff09;构造数据&#xff0c;y3*x5; &#xff08;2&#xff09;随机初始化和&#xff0c;任意数值&#xff0c;例如9,10; &#xff08;3&#xff09;计算&#xff0c;,并计算 &#xff08;4&…...

vue table合并行 动态列名

需求: 1.合并行,相同数据合并 2,根据后端返回数据动态显示列名, 我这个业务需求是,每年增加一列,也就是列名不是固定的,后端返回数据每年会多一条数据,根据返回数据显示列名 实现: html <el-table v-loading"loading" :data"dataList" :span-metho…...

Spring Cloud Alibaba-Nacos Discovery--服务治理

1 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08;ip&#xff0c;端口&#xff09;等硬编码到了代码中&#xff0c;这种做法存在许多问题&#xff1a; 一旦服务提供者地址变化&am…...

【C++】unordered_map和unordered_set的使用 及 OJ练习

文章目录 前言1. unordered系列关联式容器2. map、set系列容器和unordered_map、unordered_set系列容器的区别3. unordered_map和unordered_set的使用4. set与unordered_set性能对比5. OJ练习5.1 在长度 2N 的数组中找出重复 N 次的元素思路分析AC代码 5.2 两个数组的交集思路分…...

初识 JVM 01

JVM JRE JDK的关系 JVM 的内存机构 程序计数器 java指令的执行流程&#xff1a; 1 右侧的java源代码编译为左侧的java字节码&#xff08;右侧第一个方块对应左侧第一个方块&#xff09; 2 字节码 经过解释器 变为机器码 3 机器码就可以被cpu来执行 程序计数器的作用就…...

FPGA应用学习笔记----I2S和总结

时序一致在慢时序方便得多 增加了时序分布和分析的复杂性 使用fifo会开销大量资源...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...