/// <summary> /// 是否警戒状态 /// </summary> /// <returns></returns> public bool isCritical() { var closerPlayer = closerOpponent(); if (!closerPlayer) { return(false); } var dist = (pos - closerPlayer.pos).magnitude; if (dist > enemy.criticalRange) { return(false); } Vector2 targetDirection = closerPlayer.transform.position - transform.position; Vector2 towardDirection = RuntimeCharacter.dir82Vec(direction); float angle = Vector2.Angle(targetDirection, towardDirection); if (angle > deteAngle) { return(false); } Ray2D ray2D = new Ray2D(pos, closerPlayer.pos); Debug.DrawLine(pos, closerPlayer.pos, Color.red); RaycastHit2D hit = Physics2D.Raycast(pos, closerPlayer.pos - pos, 100, (1 << 11 | 1 << 10)); var mapPlayer = SceneUtils.get <MapPlayer>(hit.collider); return(hit && mapPlayer); }
/// <summary> /// 使用磁石 /// </summary> void useMagnetite() { var dir = player.direction; var vec = RuntimeCharacter.dir82Vec(dir); //var resList = Physics2D.RaycastAll(pos, vec, magnetiteDist); Collider2D collider2d = Physics2D.OverlapBox(pos, collider.bounds.size, 0f, 1 << 8); for (int i = 1; i < magnetiteDist; i++) { collider2d = Physics2D.OverlapBox(pos + vec * i, collider.bounds.size, 0f, 1 << 8); debugLog(collider2d?.name); debugLog(collider?.bounds.size); var obj = collider2d?.gameObject; targetCol = SceneUtils.get <WaterColumn>(obj); if (targetCol == null) { continue; } runtimeActor.addEnergy(-magnetiteEnergy); moveDirection(dir); break; } //foreach(var res in resList) { // var obj = res.collider?.gameObject; // targetCol = SceneUtils.get<WaterColumn>(obj); // if (targetCol == null) continue; // moveDirection(dir); break; //} }
/// <summary> /// 计算闪烁位置 /// </summary> public float calFlashDistance() { Vector2 flashVec = RuntimeCharacter.dir82Vec(direction); //闪烁方向 Vector2 dropPos = collCenter + flashVec * flashDistance; //落点 Vector2 colliderSize = new Vector2(collider.bounds.size.x - 0.02f, collider.bounds.size.y - 0.02f); //微调碰撞盒 Collider2D collHard = Physics2D.OverlapCapsule(dropPos, colliderSize, CapsuleDirection2D.Horizontal, 0f, (1 << 11) | (1 << 4) | (1 << 15)); //落点碰撞判断 RaycastHit2D raycastHit2D = Physics2D.Raycast(pos, flashVec, flashDistance, (1 << 11) | (1 << 4) | (1 << 15)); Collider2D collSoft = Physics2D.OverlapCapsule(dropPos, colliderSize, CapsuleDirection2D.Horizontal, 0f, (1 << 8));//落点碰撞判断 float flashDistStep = 0.05f; float flashDistRes = 0.0f; if (raycastHit2D || collSoft) { //寻找最远落点 while (flashDistStep <= flashDistance) { collHard = Physics2D.OverlapCapsule(collCenter + flashVec * flashDistStep, colliderSize, CapsuleDirection2D.Horizontal, 0f, (1 << 11) | (1 << 4) | (1 << 15)); collSoft = Physics2D.OverlapCapsule(collCenter + flashVec * flashDistStep, colliderSize, CapsuleDirection2D.Horizontal, 0f, (1 << 8));//落点碰撞判断 debugLog(collHard?.name); debugLog(collSoft?.name); if (collHard) { break; } if (!collSoft || collSoft.isTrigger) { flashDistRes = flashDistStep; } flashDistStep += 0.05f; } return(flashDistRes); } //直接闪烁到最远距离 else { return(flashDistance); } }
/// <summary> /// 将闪烁距离应用到闪烁 /// </summary> /// <param name="distance"></param> public void applyFlashDistance(float distance) { Vector2 flashVec = RuntimeCharacter.dir82Vec(direction);//闪烁方向 flashPos = pos + flashVec * distance; }
/// <summary> /// 配置速度 /// </summary> void setupVelocity(RuntimeCharacter.Direction d) { var vec = RuntimeCharacter.dir82Vec(d); rigidbody.velocity = vec * speed; }