Add color animations + small color enhancements.

This commit is contained in:
EliyaFishman 2022-12-03 21:23:08 +02:00
parent a4a0b31c47
commit f24407c92f
4 changed files with 47 additions and 14 deletions

View file

@ -5,6 +5,7 @@ using System.Linq;
using Bread2Unity; using Bread2Unity;
using UnityEditor; using UnityEditor;
using UnityEditor.Animations; using UnityEditor.Animations;
using UnityEditor.Graphs;
using UnityEngine; using UnityEngine;
using Animation = Bread2Unity.Animation; using Animation = Bread2Unity.Animation;
@ -96,13 +97,28 @@ namespace Bread2Unity
var scaleXCurve = new BccadCurve(); var scaleXCurve = new BccadCurve();
var scaleYCurve = new BccadCurve(); var scaleYCurve = new BccadCurve();
var rColorCurve = new BccadCurve();
var gColorCurve = new BccadCurve();
var bColorCurve = new BccadCurve();
var opacityCurve = new BccadCurve();
var spriteFrames = new List<ObjectReferenceKeyframe>(); var spriteFrames = new List<ObjectReferenceKeyframe>();
var currentTime = 0f; var currentTime = 0f;
// Check to see if we need to animate colors
for (int stepIndex = 0; stepIndex < animation.Steps.Count; stepIndex++) foreach (var step in animation.Steps)
{
var sprite = step.BccadSprite;
foreach (var part in sprite.parts)
{
if (!partsOfGameObject.Contains(part))
continue;
var color = part.Multicolor * step.Color;
}
}
foreach (var currentStep in animation.Steps)
{ {
var currentStep = animation.Steps[stepIndex];
var bccadSprite = currentStep.BccadSprite; var bccadSprite = currentStep.BccadSprite;
// Find the index of part of the game object // Find the index of part of the game object
var partIndex = bccadSprite.parts.Select((value, index) => new { value, index }) var partIndex = bccadSprite.parts.Select((value, index) => new { value, index })
@ -121,7 +137,7 @@ namespace Bread2Unity
var height = bccadSpritePart.StretchY / bccadPrefab.HeightRatio; var height = bccadSpritePart.StretchY / bccadPrefab.HeightRatio;
var x = (bccadSpritePart.PosX + currentStep.TranslateX - 512f) / var x = (bccadSpritePart.PosX + currentStep.TranslateX - 512f) /
SpriteCreator.PixelsPerUnit + sprite.bounds.size.x * 0.5f * width; SpriteCreator.PixelsPerUnit + sprite.bounds.size.x * 0.5f * width;
var y = -(bccadSpritePart.PosY + currentStep.TranslateY- 512f) / SpriteCreator.PixelsPerUnit - var y = -(bccadSpritePart.PosY + currentStep.TranslateY - 512f) / SpriteCreator.PixelsPerUnit -
sprite.bounds.size.y * 0.5f * height; sprite.bounds.size.y * 0.5f * height;
var z = -0.00001f * partIndex; var z = -0.00001f * partIndex;
@ -146,6 +162,12 @@ namespace Bread2Unity
flipYCurve.AddKey(currentTime, bccadSpritePart.FlipY ? 1 : 0); flipYCurve.AddKey(currentTime, bccadSpritePart.FlipY ? 1 : 0);
rotationCurve.AddKey(currentTime, -bccadSpritePart.Rotation); rotationCurve.AddKey(currentTime, -bccadSpritePart.Rotation);
var color = bccadSpritePart.Multicolor * currentStep.Color;
rColorCurve.AddKey(currentTime, color.r);
gColorCurve.AddKey(currentTime, color.g);
bColorCurve.AddKey(currentTime, color.b);
opacityCurve.AddKey(currentTime, color.a);
} }
// Increase the time for the next frame // Increase the time for the next frame
@ -195,6 +217,17 @@ namespace Bread2Unity
animationClip.SetCurve(child.name, typeof(Transform), "localScale.x", scaleXCurve); animationClip.SetCurve(child.name, typeof(Transform), "localScale.x", scaleXCurve);
animationClip.SetCurve(child.name, typeof(Transform), "localScale.y", scaleYCurve); animationClip.SetCurve(child.name, typeof(Transform), "localScale.y", scaleYCurve);
} }
// We check if any of the steps color that have the game object is not white
var colorChanges = animation.Steps.Where(step => step.BccadSprite.parts.Any(part => partsOfGameObject.Contains(part)))
.Any(step => !step.Color.Equals(Color.white));
if (colorChanges || partsOfGameObject.Select(part => part.Multicolor).Distinct().Count() > 1)
{
animationClip.SetCurve(child.name, typeof(SpriteRenderer), "m_Color.r", rColorCurve);
animationClip.SetCurve(child.name, typeof(SpriteRenderer), "m_Color.g", gColorCurve);
animationClip.SetCurve(child.name, typeof(SpriteRenderer), "m_Color.b", bColorCurve);
animationClip.SetCurve(child.name, typeof(SpriteRenderer), "m_Color.a", opacityCurve);
}
} }
animationClip.frameRate = 30; //fps animationClip.frameRate = 30; //fps

View file

@ -56,8 +56,8 @@ namespace Bread2Unity
var spriteRenderer = (SpriteRenderer)gameObjectPart.AddComponent(typeof(SpriteRenderer)); var spriteRenderer = (SpriteRenderer)gameObjectPart.AddComponent(typeof(SpriteRenderer));
spriteRenderer.sprite = sprite; spriteRenderer.sprite = sprite;
spriteRenderer.color = spritePart.GetColor();
spriteRenderer.flipX = spritePart.FlipX; spriteRenderer.flipX = spritePart.FlipX;
spriteRenderer.color = spritePart.Multicolor;
spriteRenderer.flipY = spritePart.FlipY; spriteRenderer.flipY = spritePart.FlipY;
spriteRenderer.enabled = true; spriteRenderer.enabled = true;
gameObjectPart.transform.SetParent(prefab.ParentObject.transform); gameObjectPart.transform.SetParent(prefab.ParentObject.transform);

View file

@ -60,7 +60,8 @@ namespace Bread2Unity
Convert.ToInt32(byteBuffer.ReadByte() & 0xff) / 255f, Convert.ToInt32(byteBuffer.ReadByte() & 0xff) / 255f,
Convert.ToInt32(byteBuffer.ReadByte() & 0xff) / 255f); Convert.ToInt32(byteBuffer.ReadByte() & 0xff) / 255f);
part.Opacity = byteBuffer.ReadByte(); part.Multicolor.a = byteBuffer.ReadByte() / 255f;
for (int k = 0; k < 12; k++) for (int k = 0; k < 12; k++)
{ {
byteBuffer.ReadByte(); byteBuffer.ReadByte();
@ -118,7 +119,7 @@ namespace Bread2Unity
byteBuffer.ReadByte(); byteBuffer.ReadByte();
byteBuffer.ReadByte(); byteBuffer.ReadByte();
byteBuffer.ReadByte(); byteBuffer.ReadByte();
step.Opacity = Convert.ToByte(Convert.ToInt32(byteBuffer.ReadShort()) & 0xFF); step.Color.a = Convert.ToInt32(byteBuffer.ReadShort() & 0xFF) / 255f;
anim.Steps.Add(step); anim.Steps.Add(step);
} }

View file

@ -25,7 +25,6 @@ namespace Bread2Unity
public bool FlipX; public bool FlipX;
public bool FlipY; public bool FlipY;
public byte Opacity;
public byte designation; public byte designation;
public short unknown; public short unknown;
@ -35,7 +34,7 @@ namespace Bread2Unity
public float brDepth; public float brDepth;
public Color Multicolor; public Color Multicolor;
public Color ScreenColor; public Color ScreenColor;
public Color GetColor() => new Color(Multicolor.r, Multicolor.g, Multicolor.b, Opacity / 255f); // public Color GetColor() => new Color(Multicolor.r, Multicolor.g, Multicolor.b, Multicolor.a);
} }
public struct RegionIndex public struct RegionIndex