private void SpawnHitBox() { //Don't spawn the hitbox if the ability was told to deactivate if (_deactivated) { return; } //Play animation now that the character has reached the target panel EnableAnimation(); _ownerMoveScript.MoveToAlignedSideWhenStuck = false; //Mark that the target position has been reached _inPosition = true; //Instantiate particles and hit box _visualPrefabInstance = MonoBehaviour.Instantiate(abilityData.visualPrefab, owner.transform); Vector3 hitBoxDimensions = new Vector3(abilityData.GetCustomStatValue("HitBoxScaleX"), abilityData.GetCustomStatValue("HitBoxScaleY"), abilityData.GetCustomStatValue("HitBoxScaleZ")); HitColliderBehaviour hitColliderRef = new HitColliderBehaviour(abilityData.GetCustomStatValue("Damage"), abilityData.GetCustomStatValue("Knockback"), abilityData.GetCustomStatValue("HitAngle"), true, abilityData.timeActive, owner, false, false, true, abilityData.GetCustomStatValue("HitStun")); HitColliderBehaviour hitCollider = HitColliderSpawner.SpawnBoxCollider(_visualPrefabInstance.transform, hitBoxDimensions, hitColliderRef); hitCollider.debuggingEnabled = true; //Set hitbox position _visualPrefabInstance.transform.position = owner.transform.position + (owner.transform.forward * abilityData.GetCustomStatValue("HitBoxDistanceZ") + (owner.transform.right * abilityData.GetCustomStatValue("HitBoxDistanceX"))); }
//Called when ability is used protected override void Activate(params object[] args) { //Create collider for attack _fistCollider = new HitColliderBehaviour(abilityData.GetCustomStatValue("Damage"), abilityData.GetCustomStatValue("KnockBackScale"), abilityData.GetCustomStatValue("HitAngle"), true, abilityData.timeActive, owner, false, false, true, abilityData.GetCustomStatValue("HitStun")); //Spawn particles _visualPrefabInstance = MonoBehaviour.Instantiate(abilityData.visualPrefab, ownerMoveset.MeleeHitBoxSpawnTransform); //Spawn a game object with the collider attached HitColliderBehaviour hitScript = HitColliderSpawner.SpawnBoxCollider(owner.transform, new Vector3(1, 0.5f, 0.2f), _fistCollider); hitScript.debuggingEnabled = true; Rigidbody rigid = hitScript.gameObject.AddComponent <Rigidbody>(); rigid.useGravity = false; //Set the direction of the attack Vector2 attackPosition; if (_attackDirection == Vector2.zero) { _attackDirection = (Vector2)(owner.transform.forward); } //Get the panel position based on the direction of attack and distance given attackPosition = _ownerMoveScript.Position + (_attackDirection * abilityData.GetCustomStatValue("TravelDistance")); //Clamp to be sure the player doesn't go off grid attackPosition.x = Mathf.Clamp(attackPosition.x, 0, BlackBoardBehaviour.Instance.Grid.Dimensions.x - 1); attackPosition.y = Mathf.Clamp(attackPosition.y, 0, BlackBoardBehaviour.Instance.Grid.Dimensions.y - 1); //Equation to calculate speed of attack given the active time float distance = abilityData.GetCustomStatValue("TravelDistance") + (abilityData.GetCustomStatValue("TravelDistance") * BlackBoardBehaviour.Instance.Grid.PanelSpacing); _ownerMoveScript.Speed = (distance * 2 / abilityData.timeActive) * BlackBoardBehaviour.Instance.Grid.PanelSpacing; //Change move traits to allow for free movement on the other side of the grid _ownerMoveScript.canCancelMovement = true; _ownerMoveScript.AlwaysLookAtOpposingSide = false; //Change rotation to the direction of movement owner.transform.forward = new Vector3(_attackDirection.x, 0, _attackDirection.y); //Move towards panel _ownerMoveScript.MoveToPanel(attackPosition, false, GridScripts.GridAlignment.ANY, true, false); }