private void DoMelee() { if (meleeAttackTimer > 0f) { return; } meleeAttackTimer = meleeAttackDelay; RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, moveDir, meleeDistance); bool didHit = false; foreach (RaycastHit2D hit in hits) { if (hit.collider.gameObject != this.gameObject) { // first hit other than me // deal damage to player CharacterController2D otherPlayer = hit.collider.GetComponent <CharacterController2D>(); if (otherPlayer != null) { didHit = true; otherPlayer.Hit(3); if (otherPlayer.hitpoints == 0) { otherPlayer.gameObject.SetActive(false); otherPlayer.ReleaseCapturedPlayers(); capturedPlayers.Add(otherPlayer.playerID); } } //Debug.Log(hit.collider.gameObject.name); break; } } // create melee GameObject newMelee = Instantiate(meleePrefab); newMelee.transform.position = transform.position + (Vector3)moveDir.normalized * 0.5f; newMelee.transform.localScale = Vector3.one; newMelee.transform.Rotate(new Vector3(0, 0, Vector2.SignedAngle(Vector2.right, moveDir.normalized))); DespawnAnimation dAnim = newMelee.GetComponent <DespawnAnimation>(); dAnim.spriteList = SpriteManager.instance.GetModifiedSprites(SpriteManager.MELEE_SPRITES); dAnim.incrementIndex = true; dAnim.FrameTimer = 1 / 20f; GameLogic.instance.soundGenerator.AddSwordSound(); }
private void Update() { crosshair.enabled = attackPressed; chargeRenderer.gameObject.SetActive(attackPressed); // charge attack if (attackPressed) { attackCharge = Mathf.Min(attackCharge + Time.deltaTime * attackChargeRate, attackMaxCharge); crosshair.SetPosition(0, transform.position + (Vector3)attackDir.normalized * 0.4f); crosshair.SetPosition(1, transform.position + (Vector3)attackDir.normalized * 1f); crosshair.startWidth = crosshair.endWidth = Mathf.Clamp01(attackCharge / attackMaxCharge) * 0.3f; chargeRenderer.sprite = chargeSprites[Mathf.FloorToInt(Mathf.Clamp01(attackCharge / attackMaxCharge) * (chargeSprites.Count - 4))]; } else { // not pressing attack joystick if (attackCharge > 0) { RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, attackDir); foreach (RaycastHit2D hit in hits) { if (hit.collider.gameObject != this.gameObject && hit.collider.GetComponent <RobotPartPhysics>() == null && hit.collider.GetComponent <MagnetCollider>() == null) { // first hit other than me // create laser GameObject newLaser = Instantiate(laserPrefab); newLaser.transform.position = new Vector2(transform.position.x, transform.position.y); SpriteRenderer sr = newLaser.GetComponent <SpriteRenderer>(); newLaser.transform.Rotate(Vector3.forward, Vector2.SignedAngle(Vector2.right, attackDir.normalized)); sr.size = new Vector2(hit.distance, 1); sr.material.SetTexture("_SwapTex", mainColorSwapTex); DespawnAnimation dAnim = newLaser.GetComponent <DespawnAnimation>(); dAnim.incrementIndex = false; dAnim.FrameTimer = 0.2f; dAnim.spriteList = SpriteManager.instance.GetModifiedSprites(SpriteManager.LASER_SPRITES); dAnim.spriteIndex = Mathf.FloorToInt(Mathf.Clamp01(attackCharge / attackMaxCharge) * (dAnim.spriteList.Count - 1)); GameObject chargePuff = Instantiate(chargeRenderer.gameObject, transform); chargePuff.SetActive(true); chargePuff.GetComponent <SpriteRenderer>().sortingOrder = 20; DespawnAnimation dAnim2 = chargePuff.AddComponent(typeof(DespawnAnimation)) as DespawnAnimation; dAnim2.incrementIndex = true; dAnim2.FrameTimer = 0.07f; dAnim2.spriteList = chargeSprites; dAnim2.spriteIndex = 7; // deal damage to player CharacterController2D otherPlayer = hit.collider.GetComponent <CharacterController2D>(); if (otherPlayer != null) { otherPlayer.Hit(attackCharge); } //Debug.Log(hit.collider.gameObject.name); break; } } GameLogic.instance.soundGenerator.AddLaserSound(); attackCharge = 0; } } if (attackCharge > 0 && !hasCharged) { GameLogic.instance.soundGenerator.AddLaserChargeSound(); hasCharged = true; } else if (attackCharge == 0) { hasCharged = false; } Vector2 direction = movePressed ? moveDir : Vector2.zero; // Use GetAxisRaw to ensure our input is either 0, 1 or -1. if (testWithKeyboard) { direction.x = Input.GetAxisRaw("Horizontal"); direction.y = Input.GetAxisRaw("Vertical"); moveDir = direction; attackPressed = Input.GetMouseButton(0); attackDir = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; attackDir.Normalize(); if (Input.GetKeyDown(KeyCode.Space)) { DoMelee(); } } if (direction != Vector2.zero) { stopWalkNoise = false; GameLogic.instance.soundGenerator.AddWalkSound(); legFrameTimer -= Time.deltaTime; if (legFrameTimer <= 0) { legFrameTimer += LegFrameInterval; legIndex = ++legIndex % legSprites.Count; } if (legIndex == 0 || legIndex == 5) { GameObject dust = Instantiate(dustPrefab, GameLogic.instance.playerParentTransform); dust.transform.position = transform.position + new Vector3(legIndex == 0 ? -0.45f : 0.45f, -0.35f); DespawnAnimation dAnim = dust.GetComponent <DespawnAnimation>(); dAnim.spriteList = SpriteManager.instance.GetModifiedSprites(SpriteManager.WALK_DUST_SPRITES); dAnim.incrementIndex = true; dAnim.spriteIndex = 0; dAnim.FrameTimer = 0.3f; } wireFrameTimer -= Time.deltaTime; // double up on wire frame time when walking } else if (stopWalkNoise == false) { GameLogic.instance.soundGenerator.StopWalkSound(); stopWalkNoise = true; } wireFrameTimer -= Time.deltaTime; if (wireFrameTimer <= 0) { wireFrameTimer += WireFrameInterval; wireIndex = ++wireIndex % wireSprites.Count; } shinyRenderer.gameObject.SetActive(false); if (hitpoints == MAX_HP) { shinyTimer -= Time.deltaTime; if (shinyTimer <= 0) { shinyIndex = Mathf.FloorToInt(Mathf.Abs(shinyTimer) * 16); if (shinyIndex >= shinySprites.Count) { shinyTimer = Random.Range(2f, 3f); } else { shinyRenderer.sprite = shinySprites[shinyIndex]; shinyRenderer.gameObject.SetActive(true); } } } velocity = direction; velocity.Normalize(); robot.AddForce(velocity * speed, ForceMode2D.Impulse); //if (Input.GetAxisRaw("Jump") != 0 && !isHit) { // //isHit = true; // GameObject robotPart = Instantiate(partPrefab, partParentTransform); //} bodyIndex = Mathf.Clamp(bodySprites.Count - Mathf.RoundToInt(bodySprites.Count * ((float)hitpoints / MAX_HP)), 0, bodySprites.Count - 1); bodyRenderer.sprite = bodySprites[bodyIndex]; shinyRenderer.GetComponent <SpriteMask>().sprite = bodySprites[bodyIndex]; legRenderer.sprite = legSprites[legIndex]; wireRenderer.sprite = wireSprites[wireIndex]; wireRenderer.gameObject.SetActive(bodyIndex >= bodySprites.Count - 2); Vector3 scale = Vector3.one; scale.x = moveDir.x < 0 ? -1 : 1; bodyRenderer.transform.localScale = scale; legRenderer.transform.localScale = scale; wireRenderer.transform.localScale = scale; shinyRenderer.transform.localScale = scale; if (hitpoints == 0) { isBlinking = true; if (blinkTimer <= -0.2f) { blinkTimer = 0.2f; SetRobotColor(Color.red, false); } } if (isBlinking) { blinkTimer -= Time.deltaTime; if (blinkTimer <= 0) { SetRobotColor(Color.clear, true); isBlinking = false; } } if (meleeAttackTimer > 0f) { meleeAttackTimer -= Time.deltaTime; } }