Пример #1
0
    public override void OnInspectorGUI()
    {
        D2D_Helper.BaseRect    = D2D_Helper.Reserve(0.0f);
        D2D_Helper.BaseRectSet = true;

        EditorGUI.BeginChangeCheck();

        serializedObject.UpdateIfDirtyOrScript();

        Target  = (T)target;
        Targets = targets.Select(t => (T)t).ToArray();

        Separator();

        OnInspector();

        Separator();

        serializedObject.ApplyModifiedProperties();

        if (EditorGUI.EndChangeCheck() == true)
        {
            GUI.changed = true; Repaint();

            foreach (var t in Targets)
            {
                D2D_Helper.SetDirty(t);
            }
        }

        D2D_Helper.BaseRectSet = false;
    }
Пример #2
0
    public static byte[] ExtractAlphaData(Texture2D texture)
    {
        if (texture != null)
        {
#if UNITY_EDITOR
            D2D_Helper.MakeTextureReadable(texture);
#endif
            var width  = texture.width;
            var height = texture.height;
            var total  = width * height;
            var data   = new byte[total];

            for (var y = 0; y < height; y++)
            {
                for (var x = 0; x < width; x++)
                {
                    data[x + y * width] = (byte)(texture.GetPixel(x, y).a * 255.0f);
                }
            }

            return(data);
        }

        return(null);
    }
Пример #3
0
 protected virtual void Update()
 {
     if (RequiredFixture == null)
     {
         D2D_Helper.Destroy(gameObject);
     }
 }
Пример #4
0
    public override void RebuildAllColliders()
    {
        UpdateCollidable();

        DestroyCollider();

        var alphaTex = destructibleSprite.AlphaTex;

        if (alphaTex != null)
        {
            var spriteRenderer = D2D_Helper.GetOrAddComponent <SpriteRenderer>(child);
            var sprite         = Sprite.Create(alphaTex, new Rect(0, 0, alphaTex.width, alphaTex.height), Vector2.zero, 1.0f, 0, SpriteMeshType.FullRect);

            spriteRenderer.sprite = sprite;

            collider = child.AddComponent <PolygonCollider2D>();

            // Disable the collider if it couldn't form any triangles
            collider.enabled = IsDefaultPolygonCollider2D(collider) == false;

            D2D_Helper.Destroy(sprite);
            D2D_Helper.Destroy(spriteRenderer);

            UpdateColliderSettings();
        }
    }
Пример #5
0
    private static void Split(D2D_Destructible destructible, D2D_SplitGroup group, bool isClone)
    {
        var subX      = group.XMin;
        var subY      = group.YMin;
        var subWidth  = group.XMax - group.XMin + 1;
        var subHeight = group.YMax - group.YMin + 1;
        var subTotal  = subWidth * subHeight;
        var subAlpha  = new byte[subTotal];

        for (var i = group.Count - 1; i >= 0; i--)
        {
            var j = group.Indices[i];
            var a = group.Alphas[i];
            var x = (j % AlphaTexWidth) - subX;
            var y = (j / AlphaTexWidth) - subY;
            var s = x + y * subWidth;

            subAlpha[s] = a;
        }

        destructible.SubsetAlphaWith(subAlpha, subWidth, subHeight, subX, subY);

        // Split notification
        D2D_Helper.BroadcastMessage(destructible.transform, "OnDestructibleSplit", splitData, SendMessageOptions.DontRequireReceiver);
    }
Пример #6
0
 protected virtual void Update()
 {
     if (Target != null)
     {
         D2D_Helper.SetPosition(transform, Target.transform.position + Offset);
     }
 }
Пример #7
0
    public static void BlurVertically()
    {
        if (width > 0 && height > 0)
        {
            if (tempData.Length < total)
            {
                tempData = new byte[total];
            }

            for (var y = 0; y < height; y++)
            {
                for (var x = 0; x < width; x++)
                {
                    var a = GetDefault(x, y - 1);
                    var b = GetDefault(x, y);
                    var c = GetDefault(x, y + 1);
                    var t = (int)a + (int)b + (int)c;

                    tempData[x + y * width] = (byte)(t / 3);
                }
            }

            D2D_Helper.Swap(ref data, ref tempData);
        }
    }
Пример #8
0
    public static Vector3 ClosestPointToTriangle(Vector3 a, Vector3 b, Vector3 c, Vector3 p)
    {
        var r  = Quaternion.Inverse(Quaternion.LookRotation(-Vector3.Cross(a - b, a - c)));
        var ra = r * a;
        var rb = r * b;
        var rc = r * c;
        var rp = r * p;

        var a2 = D2D_Helper.VectorXY(ra);
        var b2 = D2D_Helper.VectorXY(rb);
        var c2 = D2D_Helper.VectorXY(rc);
        var p2 = D2D_Helper.VectorXY(rp);

        if (PointLeftOfLine(a2, b2, p2) == true)
        {
            return(ClosestPointToLineSegment(a, b, p));
        }

        if (PointLeftOfLine(b2, c2, p2) == true)
        {
            return(ClosestPointToLineSegment(b, c, p));
        }

        if (PointLeftOfLine(c2, a2, p2) == true)
        {
            return(ClosestPointToLineSegment(c, a, p));
        }

        var barycentric = GetBarycentric(a2, b2, c2, p2);

        return(barycentric.x * a + barycentric.y * b + barycentric.z * c);
    }
	protected virtual void Awake()
	{
		if (spriteRenderer == null) spriteRenderer = GetComponent<SpriteRenderer>();
		
		// Copy texture from sprite?
		if (MainTex == null)
		{
			var sprite = spriteRenderer.sprite;
			
			if (sprite != null)
			{
				var texture = sprite.texture;
				
				if (texture != null)
				{
					MainTex       = texture;
					Pivot         = D2D_Helper.Divide(-sprite.bounds.min.x, -sprite.bounds.min.y, sprite.bounds.size.x, sprite.bounds.size.y);
					PixelsToUnits = D2D_Helper.Divide(texture.width, sprite.bounds.size.x);
					
					if (sprite.rect.x != 0 || sprite.rect.y != 0 || sprite.rect.width != texture.width || sprite.rect.height != texture.height)
					{
						Debug.LogWarning("The sprite '" + name + "' sent to D2D_DestructibleSprite is either trimmed, or is part of a multiple sprite collection. This is currently not supported.");
					}
				}
			}
		}
	}
Пример #10
0
    public void UpdateCollidable()
    {
        if (destructibleSprite == null)
        {
            destructibleSprite = GetComponent <D2D_DestructibleSprite>();
        }

        if (child == null)
        {
            child = D2D_Helper.CreateGameObject("Colliders", transform);
        }

        alphaTex = destructibleSprite.AlphaTex;

        var colliderScale  = destructibleSprite.CalculateAlphaTexScale();
        var colliderOffset = destructibleSprite.CalculateAlphaTexOffset();

        if (child.transform.localPosition != colliderOffset)
        {
            child.transform.localPosition = colliderOffset;
        }

        if (child.transform.localScale != colliderScale)
        {
            child.transform.localScale = colliderScale;
        }
    }
Пример #11
0
    protected virtual void Update()
    {
        if (dirty == true)
        {
            dirty        = false;
            destructible = D2D_Helper.GetComponentUpwards <D2D_Destructible>(transform);

            if (destructible != null)
            {
                var alpha = destructible.GetAlpha(transform.TransformPoint(Offset));

                // Break fixture?
                if (alpha < Threshold)
                {
                    DestroyFixture();
                }
                // Break others?
                else if (fixtureID > 0)
                {
                    for (var i = AllFixtures.Count - 1; i >= 0; i--)
                    {
                        var fixture = AllFixtures[i];

                        if (fixture != null && fixture != this && fixture.fixtureID == fixtureID)
                        {
                            fixture.DestroyFixture();
                        }
                    }
                }
            }
        }
    }
Пример #12
0
 public void Destroy()
 {
     if (Collider != null)
     {
         Collider = D2D_Helper.Destroy(Collider);
     }
 }
Пример #13
0
    public void Explode()
    {
        if (Samples > 0)
        {
            var origin       = transform.position;
            var step         = 360.0f / Samples;
            var scaledDamage = Damage / Samples;

            for (var i = 0; i < Samples; i++)
            {
                var angle     = i * step;
                var direction = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle));
                var hit       = Physics2D.Raycast(origin, direction, Radius);
                var collider  = hit.collider;

                if (collider != null && collider.isTrigger == false)
                {
                    var mask = 1 << collider.gameObject.layer;

                    if ((mask & Layers.value) != 0)
                    {
                        var damageableSprite = D2D_Helper.GetComponentUpwards <D2D_DamageableSprite>(collider.transform);

                        if (damageableSprite != null)
                        {
                            damageableSprite.InflictDamage(scaledDamage);
                        }
                    }
                }
            }
        }
    }
Пример #14
0
    private void CheckFixtures()
    {
        UpdateState();

        fixtures.RemoveAll(f => f == null);         // Note: should go first, as the fixture list may change at runtime

        // Repopulate if it appears clear, as the list may be outdated
        if (fixtures.Find(f => f.Pinned == true) == null)
        {
            fixtures.Clear();
            fixtures.AddRange(GetComponentsInChildren <D2D_Fixture>());
        }

        // If we're sure there are no pinned fixtures left, detach!
        if (fixtures.Find(f => f.Pinned == true) == null)
        {
            D2D_Helper.Destroy(OldCollider);

            if (NewCollider != null)
            {
                NewCollider.enabled = true;
            }

            if (rigidbody2D.isKinematic == true)
            {
                rigidbody2D.isKinematic = false;
            }

            D2D_Helper.Destroy(this);
        }
    }
Пример #15
0
    public static void Resize(int newWidth, int newHeight)
    {
        if (newWidth >= 0 && newHeight >= 0 && width > 0 && height > 0)
        {
            var newTotal = newWidth * newHeight;

            if (tempData.Length < newTotal)
            {
                tempData = new byte[newTotal];
            }

            var w = (float)(newWidth - 1);
            var h = (float)(newHeight - 1);

            for (var y = 0; y < newHeight; y++)
            {
                for (var x = 0; x < newWidth; x++)
                {
                    tempData[x + y * newWidth] = GetBilinear((float)x / w, (float)y / h);
                }
            }

            width  = newWidth;
            height = newHeight;
            total  = newTotal;

            D2D_Helper.Swap(ref data, ref tempData);
        }
    }
	protected virtual void OnWillRenderObject()
	{
		if (spriteRenderer == null) spriteRenderer = GetComponent<SpriteRenderer>();
		
		UpdateSourceMaterial();
		
		DestroyMaterialIfSettingsDiffer();
		
		if (SourceMaterial != null)
		{
			// Clone new material?
			if (clonedMaterial == null)
			{
				clonedMaterial = D2D_Helper.Clone(SourceMaterial, false);
			}
			else
			{
				clonedMaterial.CopyPropertiesFromMaterial(SourceMaterial);
			}
			
			clonedMaterial.hideFlags = HideFlags.DontSave;
			
			clonedMaterial.SetTexture("_MainTex", MainTex);
			clonedMaterial.SetTexture("_AlphaTex", AlphaTex);
			clonedMaterial.SetFloat("_Sharpness", Sharpness);
			
			clonedMaterial.hideFlags = HideFlags.None;
		}
		
		if (spriteRenderer.sharedMaterial != clonedMaterial)
		{
			spriteRenderer.sharedMaterial = clonedMaterial;
		}
	}
    protected override void OnInspector()
    {
        EditorGUI.BeginChangeCheck();
        {
            DrawDefault("CellSize");
            DrawDefault("Tolerance");
        }
        if (EditorGUI.EndChangeCheck() == true)
        {
            foreach (var t in Targets)
            {
                if (t != null)
                {
                    var destructible = D2D_Helper.GetComponentUpwards <D2D_Destructible>(t.transform);

                    if (destructible != null)
                    {
                        t.RebuildAllColliders(destructible.AlphaTex);
                    }
                }
            }
        }

        EditorGUILayout.Separator();

        hideColliders = EditorGUILayout.Toggle("Hide Colliders", hideColliders);

        foreach (var t in Targets)
        {
            t.SetHideFlags(hideColliders == true ? HideFlags.HideInInspector : HideFlags.None);
        }
    }
Пример #18
0
    protected virtual void Update()
    {
        Seconds -= Time.deltaTime;

        if (Seconds <= 0.0f)
        {
            Destroy(gameObject);
        }
        else
        {
            if (FadeOut == true)
            {
                if (spriteRenderer == null)
                {
                    spriteRenderer = GetComponent <SpriteRenderer>();
                }

                var color = spriteRenderer.color;

                color.a = Mathf.Clamp01(D2D_Helper.Divide(Seconds, FadeSeconds));

                spriteRenderer.color = color;
            }
        }
    }
Пример #19
0
    void Update()
    {
        if (!DataCenter.CanFire || UICamera.isOverUI)
        {
            return;
        }
        // Begin dragging?
        if (Input.GetMouseButton(0) == true && down == false)
        {
            down = true;
        }

        // End dragging?
        if (Input.GetMouseButton(0) == false && down == true)
        {
            down = false;

            // Fire?
            if (Camera.main != null)
            {
                var endMousePosition = Input.mousePosition;
                var startPos         = shootPos.position;
                var endPos           = Camera.main.ScreenToWorldPoint(endMousePosition);
                var vec       = endPos - startPos;
                var angle     = D2D_Helper.Atan2(vec) * -Mathf.Rad2Deg + AngleOffset + Random.Range(-0.5f, 0.5f) * AngleRandomness;
                var clone     = D2D_Helper.CloneGameObject(Resources.Load <GameObject>("Prefabs/Bomb/Bomb" + (DataCenter.currSelectBomb + 1)), null, startPos, Quaternion.Euler(0.0f, 0.0f, angle));
                var cloneRb2D = clone.GetComponent <Rigidbody2D>();

                if (cloneRb2D != null)
                {
                    cloneRb2D.velocity = (endPos - startPos).normalized * Mathf.Min(20.0f, Vector3.Distance(endPos, startPos));
                }

                EventSystem.DispatchEvent(EType.Fire);
            }
        }

        // Show dragging?
        if (Indicator != null)
        {
            Indicator.enabled = down;

            if (Camera.main != null && down == true)
            {
                var currentMousePosition = Input.mousePosition;
                var startPos             = shootPos.position;
                var currentPos           = Camera.main.ScreenToWorldPoint(currentMousePosition);
                var scale = Vector3.Distance(currentPos, startPos);
                var angle = D2D_Helper.Atan2(currentPos - startPos) * Mathf.Rad2Deg;

                scale = Mathf.Min(20.0f, scale);

                Indicator.transform.position      = shootPos.position;
                Indicator.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, -angle);
                Indicator.transform.localScale    = new Vector3(scale, scale, scale);
            }
        }
    }
	private void DestroyAutoPolygonCollider()
	{
		if (autoPolygonCollider != null)
		{
			D2D_Helper.Destroy(autoPolygonCollider.gameObject);
			
			autoPolygonCollider = null;
		}
	}
Пример #21
0
    private Vector2 CalculateAlphaScale(Sprite sprite)
    {
        var texture     = sprite.texture;
        var textureRect = sprite.textureRect;
        var scaleX      = D2D_Helper.Divide(texture.width, Mathf.Floor(textureRect.width) + AlphaShiftX) * D2D_Helper.Divide(OriginalWidth, AlphaWidth);
        var scaleY      = D2D_Helper.Divide(texture.height, Mathf.Floor(textureRect.height) + AlphaShiftY) * D2D_Helper.Divide(OriginalHeight, AlphaHeight);

        return(new Vector2(scaleX, scaleY));
    }
Пример #22
0
    private void DestroyPolygonCollider2D()
    {
        if (polygonCollider2D != null)
        {
            D2D_Helper.Destroy(polygonCollider2D);

            polygonCollider2D = null;
        }
    }
	private void DestroyPolygonColliders()
	{
		if (polygonColliders != null)
		{
			D2D_Helper.Destroy(polygonColliders.gameObject);
			
			polygonColliders = null;
		}
	}
Пример #24
0
    public static Matrix4x4 CalculateStampMatrix(Vector2 position, Vector2 size, float angle)
    {
        var t = D2D_Helper.TranslationMatrix(position.x, position.y, 0.0f);
        var r = D2D_Helper.RotationMatrix(Quaternion.Euler(0.0f, 0.0f, angle));
        var s = D2D_Helper.ScalingMatrix(size.x, size.y, 1.0f);
        var o = D2D_Helper.TranslationMatrix(-0.5f, -0.5f, 0.0f);         // Centre stamp

        return(t * r * s * o);
    }
Пример #25
0
        public void Destroy()
        {
            if (PolygonCollider2D != null)
            {
                D2D_Helper.Destroy(PolygonCollider2D);

                PolygonCollider2D = null;
            }
        }
Пример #26
0
    protected virtual void Update()
    {
        // Begin dragging?
        if (Input.GetMouseButton(0) == true && down == false)
        {
            down = true;

            startMousePosition = Input.mousePosition;
        }

        // End dragging?
        if (Input.GetMouseButton(0) == false && down == true)
        {
            down = false;

            // Fire?
            if (Camera.main != null && Bullet != null)
            {
                var endMousePosition = Input.mousePosition;
                var startPos         = Camera.main.ScreenToWorldPoint(startMousePosition);
                startPos.Scale(new Vector3(1, 1, 0));
                var endPos = Camera.main.ScreenToWorldPoint(endMousePosition);
                endPos.Scale(new Vector3(1, 1, 0));
                var vec       = endPos - startPos;
                var angle     = D2D_Helper.Atan2(vec) * -Mathf.Rad2Deg + AngleOffset + Random.Range(-0.5f, 0.5f) * AngleRandomness;
                var clone     = D2D_Helper.CloneGameObject(Bullet, null, startPos, Quaternion.Euler(0.0f, 0.0f, angle));
                var cloneRb2D = clone.GetComponent <Rigidbody2D>();

                if (cloneRb2D != null)
                {
                    cloneRb2D.velocity = (endPos - startPos) * Power;
                }
            }
        }

        // Show dragging?
        if (Indicator != null)
        {
            Indicator.enabled = down;

            if (Camera.main != null && down == true)
            {
                var currentMousePosition = Input.mousePosition;
                var startPos             = Camera.main.ScreenToWorldPoint(startMousePosition);
                var currentPos           = Camera.main.ScreenToWorldPoint(currentMousePosition);
                var scale = Vector3.Distance(currentPos, startPos);
                var angle = D2D_Helper.Atan2(currentPos - startPos) * Mathf.Rad2Deg;

                var newPos = Camera.main.ScreenToWorldPoint(startMousePosition);
                newPos.Scale(new Vector3(1, 1, 0));

                Indicator.transform.position      = newPos;
                Indicator.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, -angle);
                Indicator.transform.localScale    = new Vector3(scale, scale, scale);
            }
        }
    }
        public void Destroy()
        {
            for (var i = Colliders.Count - 1; i >= 0; i--)
            {
                D2D_Helper.Destroy(Colliders[i]);
            }

            Colliders.Clear();
        }
        public void Destroy()
        {
            foreach (var edgeCollider2D in EdgeCollider2Ds)
            {
                D2D_Helper.Destroy(edgeCollider2D);
            }

            EdgeCollider2Ds.Clear();
        }
	private void DestroyEdgeColliders()
	{
		if (edgeColliders != null)
		{
			D2D_Helper.Destroy(edgeColliders.gameObject);
			
			edgeColliders = null;
		}
	}
    protected virtual void Update()
    {
        if (Input.GetMouseButton(0) == true && down == false && Time.timeScale == 1)
        {
            down = true;
            startMousePosition = Input.mousePosition;
        }

        mouse_pos   = Input.mousePosition;
        object_pos  = Camera.main.WorldToScreenPoint(SpawnPoint.transform.position);
        mouse_pos.x = mouse_pos.x - object_pos.x;
        mouse_pos.y = mouse_pos.y - object_pos.y;
        var angle2 = Mathf.Atan2(mouse_pos.y, mouse_pos.x) * Mathf.Rad2Deg;

        if (Input.GetMouseButton(0) == false && down == true)
        {
            down = false;
            if (angle2 < 50 && angle2 > -50)
            {
                if (Camera.main != null && Bullet != null)
                {
                    var     endMousePosition = Input.mousePosition;
                    var     startPos         = Camera.main.ScreenToWorldPoint(startMousePosition);
                    var     endPos           = Camera.main.ScreenToWorldPoint(endMousePosition);
                    var     vec            = (endPos - startPos) * Power;
                    var     angle          = D2D_Helper.Atan2(vec) * -Mathf.Rad2Deg + AngleOffset + Random.Range(-0.5f, 0.5f) * AngleRandomness;
                    Vector3 rotationVector = new Vector3(0, 0, angle2);
                    SpawnPoint.transform.rotation = Quaternion.Euler(rotationVector);
                    var clone     = D2D_Helper.CloneGameObject(Bullet, null, SpawnPoint.transform.position, Quaternion.Euler(0.0f, 0.0f, angle2));
                    var cloneRb2D = clone.GetComponent <Rigidbody2D>();

                    if (cloneRb2D != null)
                    {
                        cloneRb2D.velocity = (endPos - startPos) * Power;
                        cloneRb2D.AddForce(new Vector2(100, 50));
                    }
                }
            }
        }

        if (Indicator != null && angle2 < 50 && angle2 > -50)
        {
            Indicator.enabled = down;
            if (Camera.main != null && down == true)
            {
                var currentMousePosition = Input.mousePosition;
                var startPos             = Camera.main.ScreenToWorldPoint(SpawnPoint.transform.position);
                var currentPos           = Camera.main.ScreenToWorldPoint(currentMousePosition);
                var scale = Vector3.Distance(currentPos, startPos);
                Debug.Log(scale);
                Indicator.transform.position      = SpawnPoint.transform.position;
                Indicator.transform.localRotation = Quaternion.Euler(0.0f, 0.0f, angle2);
                Indicator.transform.localScale    = new Vector3(scale / 15, scale / 15, scale / 15);
            }
        }
    }