//对应actor类型 创建 private SkillActionBase GetSkillActionBase(uint frame, SkillAssetInfo skillInfo) { switch (skillInfo.actionType) { case SkillDefine.SkillActionType.PLAY_CONTROL: return(new SAPlayerControl(skillInfo.isCtrl, skillInfo.isSkillDir, this, frame)); case SkillDefine.SkillActionType.PLAY_ANIM: return(new SAPlayAnim(skillInfo.animName, this, frame)); case SkillDefine.SkillActionType.PLAY_MOVE: MoveInfo moveInfo = skillInfo.moveInfo; return(new SAPlayerMove(moveInfo, this, frame)); case SkillDefine.SkillActionType.COLLIDER: CollBase collider = GetOperaColliderInfo(skillInfo.colliderInfo); return(new SACollider(collider, skillInfo.colliderInfo, this, frame)); case SkillDefine.SkillActionType.COLLIDER_MOVE: CollBase colliderMove = GetOperaColliderInfo(skillInfo.colliderInfo); moveInfo = skillInfo.moveInfo; return(new SAColliderMove(moveInfo, colliderMove, skillInfo.colliderInfo, this, frame)); case SkillDefine.SkillActionType.ADD_EFFECT: return(new SAEffect(skillInfo.effectInfo, this, frame)); //case SkillDefine.SkillActionType.FIGHT_EFFECT: // return new SAFightEffect(skillInfo.fightEffects,this,frame); } return(new SkillActionBase(this, frame)); }
private CollBase GetOperaColliderInfo(ColliderInfo colliderInfo) { CollBase collider = null; float startX = SkillPlayer.MovePos.x + colliderInfo.StartX; float startZ = SkillPlayer.MovePos.z + colliderInfo.StartZ; float angle = colliderInfo.StartAngle; if (colliderInfo.CollPosType == CollBase.PosType.SKILL || colliderInfo.CollPosType == CollBase.PosType.SKILL_ROTATE) { startX = Command.TargetPos.x + colliderInfo.StartX; startZ = Command.TargetPos.z + colliderInfo.StartZ; //附加操作旋转 if (colliderInfo.CollPosType == CollBase.PosType.SKILL_ROTATE) { // 方向盘角度 与场景角度差异修正 修正符号(场景y轴 逆时针旋转 与方向盘顺时针旋转 一致) angle = Mathf.Atan2(-Command.SkillDir.z, Command.SkillDir.x) * Mathf.Rad2Deg + colliderInfo.StartAngle; } } switch (colliderInfo.ColliderType) { case CollBase.ColType.RECTANGLE: collider = new CollRectange(startX, startZ, angle, colliderInfo.Width, colliderInfo.Height); break; case CollBase.ColType.SECTOR: collider = new CollSector(startX, startZ, angle, colliderInfo.InCircle, colliderInfo.OutCircle, colliderInfo.Angle); break; default: collider = new CollRadius(startX, startZ, angle, colliderInfo.Radius); break; } return(collider); }
public SAColliderMove(MoveInfo moveInfo, CollBase collider, ColliderInfo collidInfo, SkillActionParser actionParser, uint actFrame) : base(collider, collidInfo, actionParser, actFrame) { _moveInfo = moveInfo; _moveCount = 0; ActionType = SkillDefine.SkillActionType.COLLIDER_MOVE; }
public SACollider(CollBase collider, ColliderInfo collidInfo, SkillActionParser actionParser, uint actFrame) : base(actionParser, actFrame) { _collider = collider; _colliderInfo = collidInfo; _effectCounter = new EffectCounter(); _colliderCount = 0; ColliderDestroy = false; ActionType = SkillDefine.SkillActionType.COLLIDER; _frameMax = _actFrame + collidInfo.LifeTime; CheckTargetList(); }
private static Mesh CreateRectangleMesh(CollBase collider) { CollRectange coll = collider as CollRectange; Mesh mesh = new Mesh(); Vector3[] vertices = new Vector3[4]; vertices[0] = new Vector3(-coll.width * 0.5f, 0, -coll.height * 0.5f); vertices[1] = new Vector3(coll.width * 0.5f, 0, -coll.height * 0.5f); vertices[2] = new Vector3(coll.width * 0.5f, 0, coll.height * 0.5f); vertices[3] = new Vector3(-coll.width * 0.5f, 0, coll.height * 0.5f); int[] triangles = new int[6] { 0, 3, 2, 2, 1, 0 }; mesh.vertices = vertices; mesh.triangles = triangles; return(mesh); }
private static Mesh CreateSectorMesh(CollBase collider) { CollSector coll = collider as CollSector; float insideRaius = coll.inCircle; float radius = coll.outCircle; int segment = 60; float angleDegree = coll.angle; Mesh mesh = new Mesh(); int vlen = segment * 2 + 2; Vector3[] vertices = new Vector3[vlen]; float angle = Mathf.Deg2Rad * angleDegree; float currAngle = angle / 2; float deltaAngle = angle / segment; for (int i = 0; i < vlen; i += 2) { float cosA = Mathf.Cos(currAngle); float sinA = Mathf.Sin(currAngle); vertices[i] = new Vector3(cosA * insideRaius, 0, sinA * insideRaius); vertices[i + 1] = new Vector3(cosA * radius, 0, sinA * radius); currAngle -= deltaAngle; } int tlen = segment * 6; int[] triangles = new int[tlen]; for (int i = 0, vi = 0; i < tlen; i += 6, vi += 2) { triangles[i] = vi; triangles[i + 1] = vi + 1; triangles[i + 2] = vi + 3; triangles[i + 3] = vi + 3; triangles[i + 4] = vi + 2; triangles[i + 5] = vi; } mesh.vertices = vertices; mesh.triangles = triangles; return(mesh); }
private static Mesh CreateCircleMesh(CollBase collider) { int segment = 60; float radius = (collider as CollRadius).Radius; Mesh mesh = new Mesh(); int vlen = 1 + segment; Vector3[] vertices = new Vector3[vlen]; vertices[0] = Vector3.zero; float angleDegree = 360; float angle = Mathf.Deg2Rad * angleDegree; float currAngle = angle / 2; float deltaAngle = angle / segment; for (int i = 1; i < vlen; i++) { float cosA = Mathf.Cos(currAngle); float sinA = Mathf.Sin(currAngle); vertices[i] = new Vector3(cosA * radius, 0, sinA * radius); currAngle -= deltaAngle; } int tlen = segment * 3; int[] triangles = new int[tlen]; for (int i = 0, vi = 1; i < tlen - 3; i += 3, vi++) { triangles[i] = 0; triangles[i + 1] = vi; triangles[i + 2] = vi + 1; } triangles[tlen - 3] = 0; triangles[tlen - 2] = vlen - 1; triangles[tlen - 1] = 1; //链接第一个点 mesh.vertices = vertices; mesh.triangles = triangles; return(mesh); }
public static GameObject CreateColliderView(CollBase collider) { #if UNITY_EDITOR GameObject prefab = UnityEditor.AssetDatabase.LoadMainAssetAtPath("Assets/ResourcesLib/Skill/Prefabs/collider.prefab") as GameObject; if (null != prefab) { GameObject colliderView = GameObject.Instantiate(prefab); MeshFilter filter = colliderView.AddComponent <MeshFilter>(); if (filter != null) { switch (collider.ColliderType) { case CollBase.ColType.RECTANGLE: filter.sharedMesh = CreateRectangleMesh(collider); break; case CollBase.ColType.SECTOR: filter.sharedMesh = CreateSectorMesh(collider); break; default: filter.sharedMesh = CreateCircleMesh(collider); break; } } MeshRenderer meshRender = colliderView.AddComponent <MeshRenderer>(); Shader shader = Shader.Find("Diffuse"); meshRender.sharedMaterial = new Material(shader); return(colliderView); } #endif return(null); }
public static bool CheckCollision(CollBase CollA, CollBase CollB) { //GameTool.Log("ZTCollider:CheckCollision",CollA.GetV2Pos(), CollB.GetV2Pos()); if (CollA.ColliderType == CollBase.ColType.CIRCLE && CollB.ColliderType == CollBase.ColType.CIRCLE) { return(RadiusToRadius(CollA as CollRadius, CollB as CollRadius)); } if (CollA.ColliderType == CollBase.ColType.RECTANGLE && CollB.ColliderType == CollBase.ColType.RECTANGLE) { return(RectangleToRectangle(CollA as CollRectange, CollB as CollRectange)); } if (CollA.ColliderType == CollBase.ColType.SECTOR && CollB.ColliderType == CollBase.ColType.SECTOR) { return(SectorToSector(CollA as CollSector, CollB as CollSector)); } //圆与其他碰撞 if (CollA.ColliderType == CollBase.ColType.CIRCLE || CollB.ColliderType == CollBase.ColType.CIRCLE) { CollBase tmpCollA = CollA.ColliderType == CollBase.ColType.CIRCLE ? CollA : CollB; CollBase tmpCollB = CollA.ColliderType == CollBase.ColType.CIRCLE ? CollB : CollA; if (tmpCollB.ColliderType == CollBase.ColType.RECTANGLE) { return(RadiusToRectangle(tmpCollA as CollRadius, tmpCollB as CollRectange)); } return(RadiusToSector(tmpCollA as CollRadius, tmpCollB as CollSector)); } //矩形与扇形碰撞 CollBase tmpCollC = CollA.ColliderType == CollBase.ColType.RECTANGLE ? CollA : CollB; CollBase tmpCollD = CollA.ColliderType == CollBase.ColType.RECTANGLE ? CollB : CollA; return(RectangleToSector(tmpCollC as CollRectange, tmpCollD as CollSector)); }