예제 #1
0
    protected override void Awake()
    {
        base.Awake();

        _impulseSource = GetComponent <CinemachineImpulseSource>();
        _afterImage    = GetComponent <AfterImage>();
    }
예제 #2
0
    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;
    }
예제 #3
0
    /// <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);
        }
    }
예제 #4
0
 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;
 }
예제 #5
0
    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;
    }
예제 #7
0
 private Pen GetAfterImagePen(AfterImage foraimage)
 {
     Pen AfterImagePen = new Pen(foraimage.GetColour(), ((cBall)(OwnerBall.Target)).Radius * 2);
     return AfterImagePen;
 }