知识点1:物理碰撞
1.Physics.Raycast射线
Unity 中用于执行从一个点向特定方向发射射线并检测是否与任何碰撞器相交的物理函数。它常用于多种场景,如检测玩家前方是否有障碍物、确定视线是否被阻挡、交互检测等。
基本用法
if (Physics.Raycast(rayOrigin, rayDirection, out RaycastHit hitInfo, maxDistance))
{
// 如果射线击中了某个物体,则进入此代码块
}
rayOrigin
: 射线起点的位置。rayDirection
: 射线的方向。out RaycastHit hitInfo
: 当射线击中对象时,返回关于该碰撞的信息。maxDistance
: 射线的最大长度。
使用场景和作用
- 交互检测:例如,在您的
Player
类中,使用射线来检测玩家面前是否有可互动的对象(如ClearCounter
)。 - 视线检测:在射击游戏中,用于判断子弹或激光是否击中目标。
- 障碍物检测:用于检查角色前方是否有障碍物,从而决定是否需要停止移动或绕行。
注意:
确保射线的起点和方向设置正确,以避免不必要的穿透问题。例如,如果射线是从玩家中心发出的,而玩家接近一个边缘时,可能会出现穿透问题。
如果出现这类问题我们可以使用胶囊投射来解决这一问题
2.CapsuleCast 胶囊投射
用于检测胶囊体形状的射线投射方法,它扩展了基础的 Raycast
功能,允许你以胶囊体(而非单点)进行碰撞检测。这对于模拟角色控制器的移动特别有用,因为它能更准确地表示角色的实际形状和大小,从而避免一些常见的穿透问题。
基本用法
bool hit = Physics.CapsuleCast(point1, point2, radius, direction, out RaycastHit raycastHit, maxDistance, layerMask);
point1
: 胶囊体的一个端点。point2
: 胶囊体的另一个端点。radius
: 胶囊体的半径。direction
: 胶囊体投射的方向。raycastHit
: 如果有碰撞发生,则包含碰撞信息。maxDistance
: 投射的最大距离。layerMask
: 用来过滤哪些层应该被考虑进行碰撞检测。
使用场景和作用
-
精确的角色移动检测:由于大多数游戏中的角色模型可以近似为胶囊体,因此使用
CapsuleCast
来代替简单的Raycast
可以提供更加精确的碰撞检测,尤其是在处理斜坡、台阶等复杂地形时。 -
防止穿透问题:当角色靠近障碍物边缘移动时,可能会遇到穿模问题。通过使用胶囊体来代替单一射线,可以更好地适应这些情况,减少或消除穿透现象。
-
动态调整移动方向:在你的
Player
类中,你已经应用了CapsuleCast
来决定角色是否能够沿某个方向移动,并且在无法直接前进时尝试分别沿X轴或Z轴移动。这有助于提高移动的流畅性并避免卡顿。
知识点2:位掩码图层
知识点2:单例模式
单例模式(Singleton Pattern)是设计模式中的一种,属于创建型模式。它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式在许多实际应用中都非常常见,特别是在需要全局共享资源、避免资源浪费或需要控制对象创建的情况下。
单例模式的几种方法
-
懒汉式:在第一次调用时创建实例(需要考虑线程安全)
-
饿汉式:在类加载时就创建实例(线程安全但可能浪费资源)
-
双重检查锁定:结合懒汉式的优点并保证线程安全
-
静态内部类:利用类加载机制保证线程安全
-
枚举实现:最安全的实现方式,防止反射和序列化破坏单例
核心思想:
- 唯一性:一个类只有一个实例。
- 全局访问:提供一个全局访问点来获取该实例。
优点:
-
内存节省:避免频繁创建和销毁对象,减少内存开销
-
数据一致性:所有访问者都访问同一个实例,保证数据一致
-
性能优化:减少系统开销,特别是对于重量级对象的创建
-
访问控制:可以严格控制客户端的访问方式
基本用法:
非线程安全
public class Singleton {
private static Singleton instance;
// 私有构造函数,防止外部实例化
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
线程安全的懒汉式
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
饿汉式(线程安全)
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
双重检查锁定(DCL,线程安全)
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类实现(线程安全)
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
应用场景:
配置管理类:系统中通常会有配置文件(如.properties、.xml、.json等),需要全局共享配置信息。
数据库连接池:数据库连接是昂贵的资源,需要复用连接而不是频繁创建销毁。
日志记录器:系统运行日志需要统一记录到文件或日志服务器,所有模块共享同一日志实例。