protected override void Awake() { base.Awake(); _impulseSource = GetComponent <CinemachineImpulseSource>(); _afterImage = GetComponent <AfterImage>(); }
IEnumerator Dash() { Vector2 dir = spriteRenderer.flipX ? transform.right * -1 : transform.right; rigid.velocity = Vector2.zero; rigid.AddForce(dir * dashPower, ForceMode2D.Impulse); rigid.gravityScale = 0; float time = 0; float afterTime = 0; float targetTime = Random.Range(0.02f, 0.06f); while (isDash) { time += Time.deltaTime; afterTime += Time.deltaTime; if (afterTime >= targetTime) { AfterImage ai = PoolManager.GetItem <AfterImage>(); ai.SetSprite(spriteRenderer.sprite, spriteRenderer.flipX, transform.position); targetTime = Random.Range(0.02f, 0.06f); afterTime = 0; } if (time >= dashTime) { isDash = false; } yield return(null); } rigid.velocity = Vector2.zero; rigid.gravityScale = 1; }
/// <summary> /// 刷新残影 /// </summary> void UpdateAfterImage() { //刷新残影,根据生存时间销毁已过时的残影 for (int i = 0; i < _AfterImageList.Count; i++) { float _PassingTime = Time.realtimeSinceStartup - _AfterImageList[i]._StartTime; if (_PassingTime > _AfterImageList[i]._Duration) { AfterImage img = _AfterImageList[i]; _AfterImageList.Remove(_AfterImageList[i]); Destroy(img); continue; } if (_AfterImageList[i]._Material.HasProperty("_Color")) { _AfterImageList[i]._Alpha *= (1 - _PassingTime / _AfterImageList[i]._Duration); _AfterImageColor.a = _AfterImageList[i]._Alpha; _AfterImageList[i]._Material.SetColor("_Color", _AfterImageColor); } Graphics.DrawMesh(_AfterImageList[i]._Mesh, _AfterImageList[i]._Matrix, _AfterImageList[i]._Material, gameObject.layer); } }
public override void onDispose() { base.onDispose(); for (int i = 0; i < _AfterImageList.Count; i++) { AfterImage img = _AfterImageList[i]; _AfterImageList.Remove(_AfterImageList[i]); Destroy(img); } _OpenAfterImage = false; }
IEnumerator Dash(Vector2 dir) { dash.dashCDTimer = 0; dir = dir.normalized; float dashDur = dash.dashDuration; if (dashDur > dash.dashCooldown) { throw new System.Exception("dashCooldown is set too short"); } Vector3 startPos = transform.position; Vector3 endPos = startPos + (Vector3)dir * dash.dashDistance; Vector3 center = (startPos + endPos) * 0.5f; startPos = startPos - center; endPos = endPos - center; for (float timer = 0; timer < dashDur; timer += Time.deltaTime) { //Vector3.Slerp((Vector3)startPos, (Vector3)endPos, timer / dashDur) + center; Vector3 velocity = dir * Mathf.Sin(timer / dashDur * Mathf.PI); rb.MovePosition(velocity + transform.position); AfterImage afterImage = Instantiate(dash.afterImagePrefab, transform.position, Quaternion.identity); if (dir.x > dir.y) { if (dir.x > -dir.y) { afterImage.PlayDashAnimation("Right"); } else { afterImage.PlayDashAnimation("Down"); } } else { if (dir.x > -dir.y) { afterImage.PlayDashAnimation("Up"); } else { afterImage.PlayDashAnimation("Left"); } } yield return(null); } //transform.position = new Vector3(transform.position.x, transform.position.y, 0); }
private void CreateAfterImages() { if (_SpriteRenderer == null || _AfterImageMaterials == null || afterImagePrefab == null) { Debug.LogError(gameObject.name + ": Has no SpriteRenderer or no AfterImagePrefab or AfterImageMaterials was not found!"); Debug.Break(); return; } // Note: I think AfterImageGroup could be further optimized by instantiating a prefab instead of adding the component. // Create a new gameobject and add a AfterImageGroup class to it. AfterImageGroup group = new GameObject(gameObject.name + "_AfterImage_Group").AddComponent <AfterImageGroup>(); // Initialize _AfterImages array. _AfterImages = new AfterImage[MAX_AMOUNT]; // Populate the array. for (int i = 0; i < MAX_AMOUNT; i++) { // Instantiate afterImagePrefab and store a AfterImage class variable at the same time. AfterImage afterImage = Instantiate(afterImagePrefab, _AfterImageMaterials.transform).GetComponent <AfterImage>(); // Name it to have everything organized in the scene hierarchy. afterImage.name = gameObject.name + "_AfterImage" + i; // Make it a child of the group transform (again to organize). afterImage.transform.SetParent(group.transform); // Set the properties that should be used by this AfterImage. afterImage.SetProperties(_SpriteRenderer.sprite, _AfterImageMaterials.materials[i], posAndRotReference: transform); // Add it to the _AfterImages array. _AfterImages[i] = afterImage; } // Pass the _AfterImages array to the group array. group.AfterImages = _AfterImages; }
private Pen GetAfterImagePen(AfterImage foraimage) { Pen AfterImagePen = new Pen(foraimage.GetColour(), ((cBall)(OwnerBall.Target)).Radius * 2); return AfterImagePen; }