将绑定好的 Sprite 拖入场景中,为其添加Sprite Skin脚本。
点击Create Bones按钮,生成骨骼
在 C# 中,自定义特性(Attribute)的命名有个约定俗成的“语法糖”:
如果你定义的类名是
XXXAttribute,那么你可以在使用的时候省略掉Attribute后缀,只写[XXX]
public class TestAttribute : Attribute {} [Test] // 等价于 [TestAttribute] 例如: public class MyCustomAttribute : Attribute { public MyCustomAttribute(string msg) { } } [MyCustom("Hello")] // OK,自动推断 MyCustomAttribute public class MyClass {}PS:Attribute 类 (System) | Microsoft Learn
实现原理
1、隐式接口实现:正常函数实现即可
例如:public void Init(){}
2、显式式接口实现:函数前添加接口作为前缀,并且函数前不能再使用修饰符修饰
例如:void IInterface.Init(){}
public interface IUpdate { void Update(); } public class InputManager : SingleTon<InputManager>, IUpdate { void IUpdate.Update() { // 在这里实现具体的更新逻辑 // 例如:处理输入事件 } } InputManager inputManager = InputManager.Instance; // 获取单例实例 IUpdate updateInterface = inputManager; // 将实例转换为IUpdate接口类型 updateInterface.Update(); // 调用Update方法使用显式接口成员执行体通常有两个目的:
1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。
2、显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。
1. Event 类的用途
Event类在编辑器脚本中非常有用,尤其是在处理自定义编辑器窗口(EditorWindow)或自定义编辑器控件(Editor)时。通过Event类,你可以检测和处理各种输入事件,从而实现自定义的交互逻辑。
2. Event 类的主要属性和方法
type:事件的类型,如EventType.MouseDown、EventType.MouseUp、EventType.KeyDown等。button:鼠标按钮(左键、中键、右键)。keyCode:按键的键码。delta:鼠标移动的相对位置。.mousePosition:鼠标的位置。Use:标记事件已经被处理。
3. Event.Use 方法
Event.Use方法用于标记事件已经被处理,这样 Unity 就不会将该事件传递给其他处理程序。这在处理自定义控件时非常重要,可以避免事件被多次处理。
Layer 配置存储在项目的ProjectSettings/TagManager.asset文件中
关于RectTransform: 下面是全屏显示
RectTransform transform = GetComponent<RectTransform>(); transform.anchorMin = Vector2.zero; transform.anchorMax = Vector2.one; transform.anchoredPosition = Vector2.zero; transform.sizeDelta = Vector2.zero;anchoredPosition: (Left - Right )/2, (Bottom-Top)/2
sizeDelta: -(Left + Right),-(Top+Bottom)
左下,右上
RectTransform rectTransform = GetComponent<RectTransform>(); Debug.Log("rectTransform.offsetMin:" + rectTransform.offsetMin); Debug.Log("rectTransform.offsetMax:" + rectTransform.offsetMax);朝向的旋转角度
Vector3 targetPosition = new Vector3(10, 0, 10); // 目标点位置 Vector3 cameraPosition = new Vector3(0, 0, 0); // 相机位置 Quaternion rotation = Quaternion.LookRotation(targetPosition - cameraPosition, Vector3.up); { Vector3 direction = transform.position - B.transform.position; // 归一化方向向量 direction.Normalize(); // 计算旋转角度 Quaternion rotation = Quaternion.LookRotation(direction); // 将旋转角度应用到点 A 上 transform.rotation = rotation; }Unity 中的渲染队列是按照从低到高的顺序进行渲染的,队列值越小越先渲染。
Background(队列值 1000):用于渲染背景,如天空盒,是最早被渲染的队列。Geometry (队列值 2000):主要用于渲染不透明物体
AlphaTest(队列值 2450):用于需要进行 Alpha 测试的物体,渲染顺序在Geometry之后。Transparent(队列值 3000):用于渲染半透明物体,渲染顺序在AlphaTest之后。Overlay(队列值 4000):用于渲染覆盖效果,如镜头光晕,是最后被渲染的队列。Material mat mat.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Overlay;
-----------------------------------------------------------
点积的计算公式是:
Dot(A,B)=∣A∣×∣B∣×cos(θ)
其中,∣A∣ 和 ∣B∣ 是向量的长度,θ 是两个向量之间的夹角。
如果两个向量方向相同(夹角为0°),点积为正值。
如果两个向量方向相反(夹角为180°),点积为负值。
如果两个向量垂直(夹角为90°),点积为0。
System.Math.Sign是一个数学函数,用于返回一个数值的符号。它的返回值为:
1,如果输入值为正数。-1,如果输入值为负数。0,如果输入值为0。
-----------------------------------------------------------
System.DateTime.UtcNow
返回从格林威治时间1970年1月1日00:00:00至今的总秒数
int unixTimestamp = 1631021641; // 假设这是你的int数值 DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // 1970年1月1日作为起点 dateTime = dateTime.AddSeconds(unixTimestamp).ToLocalTime(); // 将秒数加到起点时间上,并转换为本地时间 // 如果你想要保留UTC时间,可以不调用ToLocalTime()方法 // dateTime = dateTime.AddSeconds(unixTimestamp); // 直接得到UTC时间 DateTime dateTime = DateTime.Now; // 假设这是你要转换的时间 string timeString = dateTime.ToString("HH