IEnumerator StartRun() { state = State.CreatingObjects; yield return(null); duration = Convert.ToSingle(durationList[durationSelId]); // Generate random values for tweens rndStartupPos = new Vector3[numTweens]; rndPositions = new Vector3[numTweens]; rndRotations = new Vector3[numTweens]; rndFloats = new float[numTweens]; for (int i = 0; i < numTweens; ++i) { rndStartupPos[i] = RandomVector3(50, 50, 20); rndPositions[i] = RandomVector3(50, 50, 20); rndRotations[i] = RandomVector3(180, 180, 180); rndFloats[i] = UnityEngine.Random.Range(-1000f, 1000f); } // Generate testObjs if (testType == TestType.Transforms) { testObjsGos = new GameObject[numTweens]; testObjsTrans = new Transform[numTweens]; } else { testObjsData = new TestObjectData[numTweens]; } for (int i = 0; i < numTweens; ++i) { if (testType == TestType.Transforms) { GameObject go = (GameObject)Instantiate(prefab); go.SetActive(true); Transform t = go.transform; if (testSetup != TestSetup.Emit) { t.position = rndStartupPos[i]; } t.parent = container; testObjsGos[i] = go; testObjsTrans[i] = t; if (disableRenderers || testType == TestType.Floats) { go.renderer.enabled = false; } } else { testObjsData[i] = new TestObjectData(); } } if (engine == Engine.DOTween) { // Set max capacity for this run. // We could set it to the correct amount, but it would be somehow unfair for LeanTween int minCapacityToBeFair = Convert.ToInt32(numTweensList[numTweensList.Length - 1]); int capacityX1 = Convert.ToInt32(numTweensList[numTweensSelId]); int neededCapacity = 0; int capacity = minCapacityToBeFair; if (testType == TestType.Transforms && positionTween) { neededCapacity += capacityX1; } if (testType == TestType.Transforms && rotationTween) { neededCapacity += capacityX1; } if (testType == TestType.Transforms && scaleTween) { neededCapacity += capacityX1; } if (minCapacityToBeFair < neededCapacity) { capacity = neededCapacity; } DOTween.SetTweensCapacity(capacity, 0); } yield return(null); state = State.TweensSetup; yield return(null); totCreationTime = Time.realtimeSinceStartup; SetupTweens(); totCreationTime = Time.realtimeSinceStartup - totCreationTime; yield return(null); state = State.Running; // Reset FPS so average is more correct fpsGadget.ResetFps(); }
IEnumerator StartRun() { state = State.CreatingObjects; yield return null; duration = Convert.ToSingle(durationList[durationSelId]); // Generate random values for tweens rndStartupPos = new Vector3[numTweens]; rndPositions = new Vector3[numTweens]; rndRotations = new Vector3[numTweens]; rndFloats = new float[numTweens]; for (int i = 0; i < numTweens; ++i) { rndStartupPos[i] = RandomVector3(50, 50, 20); rndPositions[i] = RandomVector3(50, 50, 20); rndRotations[i] = RandomVector3(180, 180, 180); rndFloats[i] = UnityEngine.Random.Range(-1000f, 1000f); } // Generate testObjs if (testType == TestType.Transforms) { testObjsGos = new GameObject[numTweens]; testObjsTrans = new Transform[numTweens]; } else { testObjsData = new TestObjectData[numTweens]; } for (int i = 0; i < numTweens; ++i) { if (testType == TestType.Transforms) { GameObject go = (GameObject)Instantiate(prefab); go.SetActive(true); Transform t = go.transform; if (testSetup != TestSetup.Emit) t.position = rndStartupPos[i]; t.parent = container; testObjsGos[i] = go; testObjsTrans[i] = t; if (disableRenderers || testType == TestType.Floats) go.GetComponent<Renderer>().enabled = false; } else testObjsData[i] = new TestObjectData(); } if (engine == Engine.DOTween) { // Set max capacity for this run. // We could set it to the correct amount, but it would be somehow unfair for LeanTween int minCapacityToBeFair = Convert.ToInt32(numTweensList[numTweensList.Length - 1]); int capacityX1 = Convert.ToInt32(numTweensList[numTweensSelId]); int neededCapacity = 0; int capacity = minCapacityToBeFair; if (testType == TestType.Transforms && positionTween) neededCapacity += capacityX1; if (testType == TestType.Transforms && rotationTween) neededCapacity += capacityX1; if (testType == TestType.Transforms && scaleTween) neededCapacity += capacityX1; if (minCapacityToBeFair < neededCapacity) capacity = neededCapacity; DOTween.SetTweensCapacity(capacity, 0); } yield return null; state = State.TweensSetup; yield return null; totCreationTime = Time.realtimeSinceStartup; SetupTweens(); totCreationTime = Time.realtimeSinceStartup - totCreationTime; yield return null; state = State.Running; // Reset FPS so average is more correct fpsGadget.ResetFps(); }
void SetupTweens() { // Ease DG.Tweening.Ease dotweenEase = easing == Easing.Linear ? DG.Tweening.Ease.Linear : DG.Tweening.Ease.InOutQuad; Holoville.HOTween.EaseType hotweenEase = easing == Easing.Linear ? Holoville.HOTween.EaseType.Linear : Holoville.HOTween.EaseType.EaseInOutQuad; LeanTweenType leanEase = easing == Easing.Linear ? LeanTweenType.linear : LeanTweenType.easeInOutQuad; GoEaseType goEase = easing == Easing.Linear ? GoEaseType.Linear : GoEaseType.QuadInOut; iTween.EaseType iTweenEase = easing == Easing.Linear ? iTween.EaseType.linear : iTween.EaseType.easeInOutQuad; // Loop int loops = testSetup == TestSetup.Emit ? 1 : -1; DG.Tweening.LoopType dotweenLoopType = testSetup == TestSetup.YoyoLoop ? DG.Tweening.LoopType.Yoyo : DG.Tweening.LoopType.Restart; Holoville.HOTween.LoopType hotweenLoopType = testSetup == TestSetup.YoyoLoop ? Holoville.HOTween.LoopType.Yoyo : Holoville.HOTween.LoopType.Restart; LeanTweenType leanLoopType = testSetup == TestSetup.YoyoLoop ? LeanTweenType.pingPong : LeanTweenType.clamp; GoLoopType goLoopType = testSetup == TestSetup.YoyoLoop ? GoLoopType.PingPong : GoLoopType.RestartFromBeginning; iTween.LoopType iTweenLoopType = loops != -1 ? iTween.LoopType.none : testSetup == TestSetup.YoyoLoop ? iTween.LoopType.pingPong : iTween.LoopType.loop; // Create tweens switch (testType) { case TestType.Floats: for (int i = 0; i < numTweens; ++i) { TestObjectData data = testObjsData[i]; switch (engine) { case Engine.HOTween: HOTween.To(data, duration, new Holoville.HOTween.TweenParms() .Prop("floatValue", rndFloats[i]) .Ease(hotweenEase) .Loops(loops, hotweenLoopType) ); break; case Engine.LeanTween: LeanTween.value(this.gameObject, x => data.floatValue = x, data.floatValue, rndFloats[i], duration).setEase(leanEase).setRepeat(loops).setLoopType(leanLoopType); break; case Engine.GoKit: Go.to(data, duration, new GoTweenConfig() .floatProp("floatValueProperty", rndFloats[i]) .setEaseType(goEase) .setIterations(loops, goLoopType) ); break; case Engine.iTween: Hashtable hs = new Hashtable(); hs.Add("from", data.floatValue); hs.Add("to", rndFloats[i]); hs.Add("time", duration); hs.Add("onupdate", "UpdateiTweenFloat"); hs.Add("looptype", iTweenLoopType); hs.Add("easetype", iTweenEase); iTween.ValueTo(this.gameObject, hs); break; default: // tCopy is needed to create correct closure object, // otherwise closure will pass the same t to all the loop TestObjectData dataCopy = data; DOTween.To(() => dataCopy.floatValue, x => dataCopy.floatValue = x, rndFloats[i], duration).SetEase(dotweenEase).SetLoops(loops, dotweenLoopType); break; } } break; default: for (int i = 0; i < numTweens; ++i) { float twDuration = testSetup == TestSetup.Emit ? UnityEngine.Random.Range(0.25f, 1f) : duration; Transform t = testObjsTrans[i]; GameObject go = testObjsGos[i]; // Used by LeanTween and iTween switch (engine) { case Engine.HOTween: Holoville.HOTween.TweenParms tp = new Holoville.HOTween.TweenParms() .Ease(hotweenEase) .Loops(loops, hotweenLoopType); if (positionTween) { Vector3 toPos = rndPositions[i]; tp.Prop("position", toPos); if (testSetup == TestSetup.Emit) { tp.OnComplete(() => EmitHOTweenPositionFor(t, toPos, twDuration, hotweenEase)); } } if (rotationTween) { Vector3 toRot = rndRotations[i]; tp.Prop("rotation", toRot); if (testSetup == TestSetup.Emit) { tp.OnComplete(() => EmitHOTweenRotationFor(t, toRot, twDuration, hotweenEase)); } } if (scaleTween) { tp.Prop("localScale", rndScale); if (testSetup == TestSetup.Emit) { tp.OnComplete(() => EmitHOTweenScaleFor(t, rndScale, twDuration, hotweenEase)); } } HOTween.To(t, twDuration, tp); break; case Engine.LeanTween: LTDescr leanTween; if (positionTween) { Vector3 toPos = rndPositions[i]; leanTween = LeanTween.move(go, rndPositions[i], twDuration).setEase(leanEase).setRepeat(loops).setLoopType(leanLoopType); if (testSetup == TestSetup.Emit) { leanTween.setOnComplete(() => EmitLeanTweenPositionFor(t, go, toPos, twDuration, leanEase)); } } if (rotationTween) { Vector3 toRot = rndRotations[i]; leanTween = LeanTween.rotate(go, rndRotations[i], twDuration).setEase(leanEase).setRepeat(loops).setLoopType(leanLoopType); if (testSetup == TestSetup.Emit) { leanTween.setOnComplete(() => EmitLeanTweenRotationFor(t, go, toRot, twDuration, leanEase)); } } if (scaleTween) { leanTween = LeanTween.scale(go, rndScale, twDuration).setEase(leanEase).setRepeat(loops).setLoopType(leanLoopType); if (testSetup == TestSetup.Emit) { leanTween.setOnComplete(() => EmitLeanTweenScaleFor(t, go, rndScale, twDuration, leanEase)); } } break; case Engine.GoKit: GoTweenConfig goConfig = new GoTweenConfig() .setEaseType(goEase) .setIterations(loops, goLoopType); if (positionTween) { Vector3 toPos = rndPositions[i]; goConfig.addTweenProperty(new PositionTweenProperty(toPos)); if (testSetup == TestSetup.Emit) { goConfig.onComplete(x => EmitGoKitPositionFor(t, toPos, twDuration, goEase)); } } if (rotationTween) { Vector3 toRot = rndRotations[i]; goConfig.addTweenProperty(new RotationTweenProperty(toRot)); if (testSetup == TestSetup.Emit) { goConfig.onComplete(x => EmitGoKitRotationFor(t, toRot, twDuration, goEase)); } } if (scaleTween) { goConfig.addTweenProperty(new ScaleTweenProperty(rndScale)); if (testSetup == TestSetup.Emit) { goConfig.onComplete(x => EmitGoKitScaleFor(t, rndScale, twDuration, goEase)); } } Go.to(t, twDuration, goConfig); break; case Engine.iTween: Hashtable hs; if (positionTween) { hs = new Hashtable(); hs.Add("position", rndPositions[i]); hs.Add("time", twDuration); hs.Add("looptype", iTweenLoopType); hs.Add("easetype", iTweenEase); iTween.MoveTo(go, hs); } if (rotationTween) { hs = new Hashtable(); hs.Add("rotation", rndRotations[i]); hs.Add("time", twDuration); hs.Add("looptype", iTweenLoopType); hs.Add("easetype", iTweenEase); iTween.RotateTo(go, hs); } if (scaleTween) { hs = new Hashtable(); hs.Add("scale", rndScale); hs.Add("time", twDuration); hs.Add("looptype", iTweenLoopType); hs.Add("easetype", iTweenEase); iTween.ScaleTo(go, hs); } break; default: // tCopy is needed to create correct closure object, // otherwise closure will pass the same t to all the loop Transform tCopy = t; DG.Tweening.Tween dotween; if (positionTween) { Vector3 toPos = rndPositions[i]; dotween = tCopy.DOMove(toPos, twDuration).SetEase(dotweenEase).SetLoops(loops, dotweenLoopType); if (testSetup == TestSetup.Emit) { dotween.OnComplete(() => EmitDOTweenPositionFor(t, toPos, twDuration, dotweenEase)); } } if (rotationTween) { Vector3 toRot = rndRotations[i]; dotween = tCopy.DORotate(toRot, twDuration).SetEase(dotweenEase).SetLoops(loops, dotweenLoopType); if (testSetup == TestSetup.Emit) { dotween.OnComplete(() => EmitDOTweenRotationFor(t, toRot, twDuration, dotweenEase)); } } if (scaleTween) { dotween = tCopy.DOScale(rndScale, twDuration).SetEase(dotweenEase).SetLoops(loops, dotweenLoopType); if (testSetup == TestSetup.Emit) { dotween.OnComplete(() => EmitDOTweenScaleFor(t, rndScale, twDuration, dotweenEase)); } } break; } } break; } }