Unity-Collider
Unity3D 中碰撞体(Collider)组件用于检测运动的物体之间是否发生碰撞,也可以作为触发器使用。产生碰撞的条件是:
2 个游戏对象都有 Collider
至少有一个游戏对象有 Rigidbody
2 个游戏对象保持相对运动(一个 Cube 放在 Plane 上,不会产生碰撞,因为没有相对运动)
碰撞体的边界不一定与游戏对象的边界一致,用户可以点击 Edit Collider 按钮编辑碰撞体的边界,也可以在属性面板里调整碰撞体边界。另外,用户可以勾选 Is Trigger 选项,作为触发器使用(不勾选将作为碰撞器使用),作为触发器使用时,不会产生碰撞,游戏对象之间会相会穿越。
1)回调方法
碰撞器回调方法:
123456// 碰撞开始void OnCollisionEnter(Collision other)// 碰撞过程中,每帧调用一次void OnCollisionStay(Collision other)// 碰撞结束void OnCollisionExit(Collision other)
触发器回调方法:
123456// 触发开始void On ...
Unity-Rigidbody
刚体(Rigidbody)是运动学(Kinematic)中的一个概念,指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。在 Unity3D 中,刚体组件赋予了游戏对象一些运动学上的属性,主要包括 Mass(质量)、Drag(阻力)、Angular Drag(角阻力)、Use Gravity(是否使用重力)、Is Kinematic(是否受物理影响)、Collision Detection(碰撞检测)、 Velocity(速度)、Force(受力)、Explosion Force(爆炸力)。没有刚体(RigidBody)组件,游戏对象之间可以相互穿透,不会产生碰撞。
1)获取刚体组件
1Rigidbody rig = GetComponent<Rigidbody>();
2)刚体组件面板属性
Mass:物体的质量(默认以千克为单位)
Drag:物体受到的空气阻力大小
Angular Drag:物体旋转时,受到的旋转阻力大小转
Use Gravity:如果启用,物体将受到重力的影响
Is Kinematic:如果启用,物体将不会由物理引擎驱动,只能 ...
Unity-人机交互Input
https://zhyan8.blog.csdn.net/article/details/125356329
Unity-MonoBehaviour的生命周期
Unity3D 中可以给每个游戏对象添加脚本,这些脚本必须继承 MonoBehaviour,用户可以根据需要重写 MonoBehaviour 的部分生命周期函数,这些生命周期函数由系统自动调用,且调用顺序与书写顺序无关。
MonoBehaviour 的继承关系:MonoBehaviour→Behaviour→Component→Object.
MonoBehaviour 的生命周期函数主要有:
OnValidate: 确认事件,脚本被加载、启用、禁用、Inspector 面板值被修改时,都会执行一次
Awake:当脚本实例被创建时调用,用于初始化脚本变量和引用。可以在该函数中获取其他组件并进行初始化操作。
OnEnable:在游戏对象或组件被启用时调用,用于处理游戏对象或组件的启用逻辑,如注册事件、开启协程等。
Start:在脚本实例被创建后第一帧被渲染前调用,用于初始化游戏对象的状态,如设置初始位置、旋转和缩放等。
FixedUpdate:在每一帧的物理模拟前调用,用于处理游戏对象的物理行为,如受力、重力、运动学等。
Update:在每一帧更新前调用,用于处理游戏对象的状态和逻辑 ...
Unity-Transform
每个游戏对象有且仅有一个 Transform 组件,Transform 组件保存了游戏对象的位置信息,用户可以通过操作 Transform 组件实现对游戏对象的平移、旋转、缩放等变换。每个 Script 组件需要继承 MonoBehaviour,MonoBehaviour 中有 Transform 属性。
1)获取当前游戏对象的 Transform 组件
1234this.transform;gameObject.tramsform;GetComponent<Transform>();gameObject.GetComponent<Transform>();
2)获取其他游戏对象的 Transform 组件
123GameObject.Find("name").transformGameObject.FindGameObjectWithTag("tag").transformtransform.FindChild("name");
3)Transform 中属性
123456789101112131 ...
C#学习对比Java
常量
C#Java12345678910111213public class ConstTest{ public const double PI = 3.14; public const int a = 0;}class ConstTestMain{ public static void Main(string[] args) { Console.WriteLine(ConstTest.PI); }}
const只能用来修饰基本数据类型、字符串类型、同为const的变量。
const修饰的变量不能再用static变量进行修饰,并且其只能在字段的声明中初始化, 所以const必须初始化且不允许动态修改,const的原理是在编译期直接对变量值进行替换的。所以虽然他没有被static变量修饰,但他还是一个静态变量可以被类名.直接调用
readonly修饰符,初始化时机:运行时,可以声明时赋值或在类中的构造函数中赋值,只允许在构造函数中修改(主要作用于实例化的对象的只读属性)
1final ...
Spring面试知识
框架篇
1. Spring refresh 流程
要求
掌握 refresh 的 12 个步骤
Spring refresh 概述
refresh 是 AbstractApplicationContext 中的一个方法,负责初始化 ApplicationContext 容器,容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法,我们把它们称为 refresh 的 12 个步骤:
prepareRefresh 创建成员变量Environment 对象
obtainFreshBeanFactory 获取(或创建) 成员变量BeanFactory, 主要将所有BeanDefinition 存入beanDefinitionMap 集合
prepareBeanFactory 为BeanFactory的各项成员变量赋值
postProcessBeanFactory 空实现,容器子类实现
invokeBeanFactoryPo ...
JVM面试知识总览
虚拟机篇
1. JVM 内存结构
要求
掌握 JVM 内存结构划分
尤其要知道方法区、永久代、元空间的关系
结合一段 java 代码的执行理解内存划分
执行 javac 命令编译源代码为字节码.class文件
执行 java 命令
创建 JVM,调用类加载子系统加载 class,将类的信息存入方法区
创建 main 线程,使用的内存区域是 JVM 虚拟机栈,开始执行 main 方法代码
如果遇到了未见过的类,会继续触发类加载过程,同样会存入方法区
需要创建对象,会使用堆内存来存储对象
不再使用的对象,会由垃圾回收器在内存不足时回收其内存
调用方法时,方法内的局部变量、方法参数所使用的是 JVM 虚拟机栈中的栈帧内存
调用方法时,先要到方法区获得到该方法的字节码指令,由解释器将字节码指令解释为机器码执行
调用方法时,会将要执行的指令行号读到程序计数器,这样当发生了线程切换,恢复时就可以从中断的位置继续
对于非 java 实现的方法调用,使用内存称为本地方法栈(见说明)
对于热点方法调用,或者频繁的循环代码,由 JIT 即时编译器将这些代码编译成机器码缓存,提高执行性能
...
TheadLocal
https://blog.csdn.net/xlgen157387/article/details/78297568
https://www.jianshu.com/p/ee8c9dccc953
Spring面试题
❤️Spring AOP的实现原理和场景实现原理场景AOP(这里的AOP指的是面向切面编程思想,而不是Spring AOP)主要的的实现技术主要有Spring AOP和AspectJ。
AspectJ的底层技术。
AspectJ的底层技术是静态代理,即用一种AspectJ支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类,该代理类增强了业务类,这是在编译时增强,相对于下面说的运行时增强,编译时增强的性能更好。
Spring AOP
Spring AOP采用的是动态代理,在运行期间对业务方法进行增强,所以不会生成新类,对于动态代理技术,Spring AOP提供了对JDK动态代理的支持以及CGLib的支持。
JDK动态代理只能为接口创建动态代理实例,而不能对类创建动态代理。需要获得被目标类的接口信息(应用Java的反射技术),生成一个实现了代理接口的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利用构造函数生成动态代理类的实例对象,在调用具体方法前调用invokeHandler方法来处理。
对类创建动态代理,CGLib动态代理需要依赖as ...