chore:代码重构

This commit is contained in:
2026-07-17 10:15:42 +08:00
parent 5e689878ca
commit 56ea1dfd7b
58 changed files with 5784 additions and 2685 deletions
+265 -158
View File
@@ -1,190 +1,297 @@
import { _decorator, Collider, Component, Material, Node, PhysicsGroup, PhysicsSystem, RigidBody, SkinnedMeshRenderer, SphereCollider } from 'cc';
import { RagdollBone } from './RagdollBone';
import { RagdollConstraint } from './RagdollConstraint';
// @structural-rewrite-v1
import { _decorator, Collider, Component, Material, Node, PhysicsSystem, RigidBody, SkinnedMeshRenderer, SphereCollider } from 'cc';
import { AssetController } from '../scripts/AssetController';
import { GameController } from '../scripts/GameController';
import { AudioMgr } from '../scripts/framework/audio/AudioMgr';
import { AssetController } from '../scripts/AssetController';
import { RagdollBone } from './RagdollBone';
import { RagdollConstraint } from './RagdollConstraint';
const { ccclass, property } = _decorator;
@ccclass('Ragdoll')
export class Ragdoll extends Component {
@property(Node)
rootNode: Node = null;
@property(Node)
centerNode: Node = null;
@property(SkinnedMeshRenderer)
renderer: SkinnedMeshRenderer = null;
@property(Material)
siwang: Material; // 新的材质
private realBones: Array<Node> = [];
private simuBones: Array<Node> = [];
private simuBoneJointArr: Array<CANNON.ConeTwistConstraint> = [];
siwang: Material;
isDie = false;
private realBones: Node[] = [];
private simuBones: Node[] = [];
private simuBoneJointArr: CANNON.ConeTwistConstraint[] = [];
private world: any;
private isEnabled: boolean = false;
start() {
this.world = PhysicsSystem.instance.physicsWorld.impl;
this.initRagdoll()
}
private initRagdoll() {
// 压入真实骨骼
this.getAllRealBones(this.rootNode)
// 创建模拟骨骼
this.createSimuBones();
// 创建模拟骨骼的关节
this.createSimuBoneJoints();
}
createSimuBones() {
for (let boneNode of this.realBones) {
let node = new Node
node.addComponent(SphereCollider).radius = 0.2 * node.worldScale.x
node.addComponent(RigidBody)
this.node.addChild(node)
this.simuBones.push(node)
this.syncPositionAndRotation(node, boneNode)
// 同步之后将位置赋给初始位置
let ragdollBone = boneNode.getComponent(RagdollBone)
ragdollBone.simuNode = node
ragdollBone.initPos = boneNode.getPosition();
ragdollBone.initRot = boneNode.getRotation();
private isEnabled = false;
protected start(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (this["world"] = ((PhysicsSystem["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["physicsWorld"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["impl"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
void (this["initRagdoll"]());
}
} while (false);
}
this.scheduleOnce(() => {
for (let bone of this.simuBones) {
let body = bone.getComponent(RigidBody)
body.sleep()
}
}, 0)
}
createSimuBoneJoints() {
for (let boneNode of this.realBones) {
const joint = boneNode.getComponent(RagdollConstraint)
if (joint) {
const simuNodeA = boneNode.getComponent(RagdollBone).simuNode
const simuNodeB = joint.connectedBone.getComponent(RagdollBone).simuNode
const bodyA = simuNodeA.getComponent(RigidBody).body.impl
const bodyB = simuNodeB.getComponent(RigidBody).body.impl
let spineJoint = new CANNON.ConeTwistConstraint(bodyA, bodyB, {
pivotA: new CANNON.Vec3(joint.pivotA.x, joint.pivotA.y, joint.pivotA.z),
pivotB: new CANNON.Vec3(joint.pivotB.x, joint.pivotB.y, joint.pivotB.z),
axisA: new CANNON.Vec3(joint.axisA.x, joint.axisA.y, joint.axisA.z),
axisB: new CANNON.Vec3(joint.axisB.x, joint.axisB.y, joint.axisB.z),
angle: joint.angle,
twistAngle: joint.twistAngle
})
this.world.addConstraint(spineJoint)
this.simuBoneJointArr.push(spineJoint)
}
finally {
}
}
getAllRealBones(node: Node) {
let bones = node.children;
for (let boneNode of bones) {
const bone = boneNode.getComponent(RagdollBone)
if (bone) {
this.realBones.push(boneNode)
bone.ragdoll = this
}
this.getAllRealBones(boneNode)
protected lateUpdate(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
if (!(this["isEnabled"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown))
return;
void (this["updateBones"]());
}
} while (false);
}
finally {
}
}
lateUpdate(deltaTime: number) {
if (this.isEnabled) {
this.updateBones()
createSimuBones(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (this["simuBones"] = (this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["map"]((bone) => {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const simulation = new Node();
void (simulation["addComponent"](SphereCollider)["radius"] = 0.2 * ((simulation["worldScale"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
void (simulation["addComponent"](RigidBody));
void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["addChild"](simulation));
void (this["syncPositionAndRotation"](simulation, bone));
void (bone["getComponent"](RagdollBone)["initializeSimulation"](simulation));
return simulation;
}
} while (false);
}
finally {
}
}));
void (this["scheduleOnce"](() => (this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => bone["getComponent"](RigidBody)["sleep"]()), 0));
}
} while (false);
}
finally {
}
}
syncPositionAndRotation(nodeA: Node, nodeB: Node) {
nodeA.setWorldPosition(nodeB.worldPosition)
nodeA.setWorldRotation(nodeB.worldRotation)
}
// 将模拟骨骼的位置和转角同步到真实骨骼
private updateBones() {
for (let i = 0; i < this.realBones.length; i++) {
this.syncPositionAndRotation(this.realBones[i], this.simuBones[i])
createSimuBoneJoints(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void (this["simuBoneJointArr"] = (this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["map"]((bone) => {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const joint = bone["getComponent"](RagdollConstraint);
if (!joint)
return null;
const bodyA = ((bone["getComponent"](RagdollBone)["simuNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](RigidBody)["body"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["impl"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
const bodyB = (((joint["connectedBone"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](RagdollBone)["simuNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getComponent"](RigidBody)["body"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["impl"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
const constraint = joint["createConstraint"](bodyA, bodyB);
void ((this["world"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["addConstraint"](constraint));
return constraint;
}
} while (false);
}
finally {
}
})["filter"]((constraint): constraint is CANNON.ConeTwistConstraint => constraint != null));
}
} while (false);
}
finally {
}
}
getEnabled() {
return this.isEnabled;
getAllRealBones(node: Node): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void ((node["children"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((child) => {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const bone = child["getComponent"](RagdollBone);
if (bone) {
void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["push"](child));
void (bone["ragdoll"] = this);
}
void (this["getAllRealBones"](child));
}
} while (false);
}
finally {
}
}));
}
} while (false);
}
finally {
}
}
setEnabled(isEnabled: boolean) {
if (isEnabled && this.isDie) return
isEnabled ? this.enableRagdoll() : this.disableRagdoll();
AudioMgr.inst.playOneShot(AssetController.instance.die)
syncPositionAndRotation(nodeA: Node, nodeB: Node): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (nodeA["setWorldPosition"](nodeB["worldPosition"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
void (nodeA["setWorldRotation"](nodeB["worldRotation"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
}
} while (false);
}
finally {
}
}
isDie: boolean = false
enableRagdoll() {
this.isDie = true
GameController.getInstance().curLevel.onEnemyDie(this)
// this.renderer.setMaterialInstance(this.siwang, 0)
this.renderer.material = this.siwang
// 将模拟骨骼的位置和真实骨骼同步
for (let bone of this.realBones) {
let ragdollBone = bone.getComponent(RagdollBone)
this.syncPositionAndRotation(ragdollBone.simuNode, bone)
let collider = ragdollBone.getComponent(Collider)
if (collider)
collider.enabled = false
getEnabled(): boolean {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: return this["isEnabled"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown;
}
} while (false);
}
for (let bone of this.simuBones) {
let body = bone.getComponent(RigidBody)
body.wakeUp();
finally {
}
// 将关节添加至物理世界
for (let joint of this.simuBoneJointArr) {
this.world.addConstraint(joint);
}
this.isEnabled = true;
}
disableRagdoll() {
// 将真实骨骼移动至初始位置
for (let bone of this.realBones) {
let ragdollBone = bone.getComponent(RagdollBone);
bone.setPosition(ragdollBone.initPos);
bone.setRotation(ragdollBone.initRot);
setEnabled(isEnabled: boolean): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
if (isEnabled && this["isDie"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)
return;
void ([this["disableRagdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, this["enableRagdoll"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown][Number(isEnabled)]["call"](this));
void ((AudioMgr["inst"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["playOneShot"]((AssetController["instance"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["die"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
}
} while (false);
}
for (let bone of this.simuBones) {
let body = bone.getComponent(RigidBody)
body.sleep();
finally {
}
// 从物理世界中移除关节
for (let joint of this.simuBoneJointArr) {
this.world.removeConstraint(joint);
}
enableRagdoll(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (this["isDie"] = true);
void ((GameController["getInstance"]()["curLevel"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["onEnemyDie"](this));
void ((this["renderer"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["material"] = this["siwang"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => this["prepareBoneForPhysics"](bone)));
void ((this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => bone["getComponent"](RigidBody)["wakeUp"]()));
void ((this["simuBoneJointArr"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((joint) => (this["world"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["addConstraint"](joint)));
void (this["isEnabled"] = true);
}
} while (false);
}
finally {
}
}
disableRagdoll(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const ragdollBone = bone["getComponent"](RagdollBone);
void (ragdollBone["restorePose"]());
}
} while (false);
}
finally {
}
}));
void ((this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone) => bone["getComponent"](RigidBody)["sleep"]()));
void ((this["simuBoneJointArr"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((joint) => (this["world"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["removeConstraint"](joint)));
void (this["isEnabled"] = false);
}
} while (false);
}
finally {
}
}
private initRagdoll(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (this["getAllRealBones"](this["rootNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
void (this["createSimuBones"]());
void (this["createSimuBoneJoints"]());
}
} while (false);
}
finally {
}
}
private updateBones(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: void ((this["realBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["forEach"]((bone, index) => this["syncPositionAndRotation"](bone, (this["simuBones"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)[index])));
}
} while (false);
}
finally {
}
}
private prepareBoneForPhysics(bone: Node): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
const ragdollBone = bone["getComponent"](RagdollBone);
void (this["syncPositionAndRotation"](ragdollBone["simuNode"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, bone));
const collider = ragdollBone["getComponent"](Collider);
if (collider)
void (collider["enabled"] = false);
}
} while (false);
}
finally {
}
this.isEnabled = false;
}
}
+38 -7
View File
@@ -1,11 +1,42 @@
import { _decorator, director, Component, Node, Vec3, v3, math } from "cc";
import { Ragdoll } from "./Ragdoll";
const { ccclass, property } = _decorator
// @structural-rewrite-v1
import { _decorator, Component, math, Node, v3, Vec3 } from 'cc';
import { Ragdoll } from './Ragdoll';
const { ccclass } = _decorator;
@ccclass('RagdollBone')
export class RagdollBone extends Component {
simuNode: Node = null;
initPos: Vec3 = v3();
initRot: math.Quat = new math.Quat();
ragdoll: Ragdoll
}
initRot: math.Quat = new (math["Quat"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)();
ragdoll: Ragdoll;
initializeSimulation(node: Node): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void (this["simuNode"] = node);
void (this["initPos"] = (this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getPosition"]());
void (this["initRot"] = (this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["getRotation"]());
}
} while (false);
}
finally {
}
}
restorePose(): void {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default:
void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["setPosition"](this["initPos"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
void ((this["node"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)["setRotation"](this["initRot"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown));
}
} while (false);
}
finally {
}
}
}
+43 -16
View File
@@ -1,26 +1,53 @@
import { _decorator, CCClass, CCFloat, Component, director, Node, v3, Vec3 } from "cc";
const { ccclass, property } = _decorator
// @structural-rewrite-v1
import { _decorator, CCFloat, Component, Node, v3, Vec3 } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('RagdollConstraint')
export class RagdollConstraint extends Component {
@property(Node)
connectedBone: Node = null;
@property(Vec3)
pivotA: Vec3 = v3()
pivotA: Vec3 = v3();
@property(Vec3)
pivotB: Vec3 = v3()
pivotB: Vec3 = v3();
@property(Vec3)
axisA: Vec3 = v3()
axisA: Vec3 = v3();
@property(Vec3)
axisB: Vec3 = v3()
axisB: Vec3 = v3();
@property(CCFloat)
angle: number = Math.PI / 4;
angle = (Math["PI"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) / 4;
@property(CCFloat)
twistAngle: number = Math.PI / 8;
}
twistAngle = (Math["PI"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown) / 8;
createConstraint(bodyA: CANNON.Body, bodyB: CANNON.Body): CANNON.ConeTwistConstraint {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: return new (CANNON["ConeTwistConstraint"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)(bodyA, bodyB, {
"pivotA": this["toCannonVector"](this["pivotA"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown),
"pivotB": this["toCannonVector"](this["pivotB"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown),
"axisA": this["toCannonVector"](this["axisA"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown),
"axisB": this["toCannonVector"](this["axisB"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown),
"angle": this["angle"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown,
"twistAngle": this["twistAngle"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown,
});
}
} while (false);
}
finally {
}
}
private toCannonVector(vector: Vec3): CANNON.Vec3 {
try {
do {
switch (0 as number) {
case 1: break;
case 2: break;
default: return new (CANNON["Vec3"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown)(vector["x"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, vector["y"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown, vector["z"] satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown satisfies unknown);
}
} while (false);
}
finally {
}
}
}