【发布时间】:2019-07-01 13:45:21
【问题描述】:
我正在尝试将游戏对象 pokemon 从屏幕中心平滑地移动到屏幕左侧(仅沿水平轴)。但是,它会立即传送。
代码的作用 = 在无限循环中从一个 sprite 更改为另一个 sprite。当它变成另一个精灵时,它也改变了它的比例。
我想要代码做什么 = 在更改为不同的精灵之前,在水平轴上向左移动。
我尝试过线性插值 (lerp) 和 transform.translate。
public class Transitions : MonoBehaviour
{
public Sprite Pokemon_0; // VARIABLES FOR SPRITES (Pokemons/ game objects)
public Sprite Pokemon_1;
float timer = 1f; // CHANGING SPRITES VALUES (delays)
float delay = 5f;
Vector2 temp; //CHANGING POSITION VARIABLES
Vector2 tempPos;
Vector2 finalPosition;
void Start()
{
this.gameObject.GetComponent<SpriteRenderer>().sprite = Pokemon_0;
}
void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)
{
if (this.gameObject.GetComponent<SpriteRenderer>().sprite == Pokemon_0) // TO CHANGE FROM POKEMON 1 TO POKEMON 2
{
this.gameObject.GetComponent<SpriteRenderer>().sprite = Pokemon_1;
temp = transform.localScale; // TO SET THE SCALE WHEN EACH POKEMON CHANGES (works)
temp.x = -380;
temp.y = 350;
transform.localScale = temp;
timer = delay;
finalPosition = new Vector2(167, -107);
transform.position = Vector3.Lerp(transform.position, finalPosition, 1f * Time.deltaTime);
//tempPos = transform.position; // Tried and tested method. Doesn't work.
//tempPos.x = 1f;
//transform.position = tempPos;
return;
}
if (this.gameObject.GetComponent<SpriteRenderer>().sprite == Pokemon_1) // TO CHANGE BACK FROM POKEMON 2 TO POKEMON 1
{
this.gameObject.GetComponent<SpriteRenderer>().sprite = Pokemon_0;
timer = delay;
return;
}
}
在执行时,此代码确实会改变口袋妖怪并改变比例。但是,位置保持不变。
我是新开的,所以我一直在尝试我们的不同建议,谢谢。
【问题讨论】:
-
您绝对应该为此使用 Lerp:docs.unity3d.com/ScriptReference/Vector3.Lerp.html
-
能否请您发布一个最小的可重现示例?我猜在这种情况下,它至少会是整个类的代码。
-
给它一个刚体和力?添加 1 个单位也可能有点像它每帧添加 1 个。如果你得到 200fps,它会飞过去
-
该代码在
Update()方法中吗? -
@DmitriyPopov 嗨,刚刚发布了整个课程并解释了它的作用。我愿意接受建议。