我目前正在 Unity 中开发游戏,但遇到了一个小问题。我正在尝试生成彩虹色效果,类似于有人在马里奥卡丁车或超级马里奥中捕捉特定游戏对象上的星星时发生的情况。基本上所有附加到脚本 InteractControl 的预制件实例都处于活动状态(循环或 lerp 槽连续 5 种不同颜色),而变量 timeLeft > 0 和 score > 10 然后返回到原始值当 timeLeft < 0 时它们的颜色。
我已经尝试了多种方法,包括使用协程,并多次重置它的颜色。仅当在 timeleft > 0 if 语句为 true 的情况下设置了 bool 的值或当前试图调整颜色时,才创建一个新方法并允许访问它,但这一切似乎都不起作用。尝试制作动画也可能是一种选择,但是它太复杂了,无法让不同颜色的对象与我原来的尺寸匹配,所以我真的很想通过脚本来改变它。
这些是相关脚本的相关部分:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteractControl : MonoBehaviour, IPooledObject
{
public Transform[] spawnPoints;
public Color[] _colors;
private float t = 0.2f;
private Rigidbody2D rb;
GameObject target;
Vector3 directionToTarget;
public static int LevelStart = 0;
public static float moveSpeed = 5f;
public static bool isSlowMotion = true;
public static float timeLeft = 12f;
private float randomSpawnTime;
private int Spawn = 1;
private float scaledTime;
private Color oldColor;
private Color newColor;
private float newT;
private void Start()
{
scaledTime = Mathf.Sin(t) * (float)(5 - 1);
oldColor = _colors[(int)scaledTime];
newColor = _colors[(int)(scaledTime + 1f)];
newT = scaledTime - Mathf.Round(scaledTime);
}
public void OnObjectSpawn()
{
target = GameObject.FindWithTag("White Ball");
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (target != null)
{
if (ScoreScript.scoreValue > 10)
{
timeLeft -= Time.deltaTime;
if (timeLeft > 0)
{
directionToTarget = (target.transform.position - transform.position).normalized;
rb.velocity = new Vector2(directionToTarget.x * moveSpeed,
directionToTarget.y * moveSpeed);
GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, 5f);
if (Spawn == 1)
{
randomSpawnTime = Random.Range(2, 8);
Spawn++;
}
if (timeLeft < randomSpawnTime && Spawn <= 2)
{
BallSpawnerControl.ClockSpawn = true;
}
}
if (timeLeft < 0)
{
GameObject[] gos = GameObject.FindGameObjectsWithTag("ColouredBall Highress");
foreach (GameObject go in gos)
{
go.SetActive(false);
}
BallSpawnerControl.HeartSpawn = true;
}
}
}
}
}