C# 移动游戏物体的最好方法是什么,平滑地移动而不是传送?
我试着将一个游戏对象,口袋妖怪,从屏幕的中心平滑地移动到屏幕的左侧,只沿着水平轴。然而,它保持瞬间传送 代码的作用=在一个无休止的循环中从一个精灵更改为另一个精灵。当它更改为另一个精灵时,它也会更改其比例 我希望代码执行的操作=在更改为其他精灵之前,在水平轴上向左移动 我尝试过线性插值lerp和transform.translateC# 移动游戏物体的最好方法是什么,平滑地移动而不是传送?,c#,unity3d,C#,Unity3d,我试着将一个游戏对象,口袋妖怪,从屏幕的中心平滑地移动到屏幕的左侧,只沿着水平轴。然而,它保持瞬间传送 代码的作用=在一个无休止的循环中从一个精灵更改为另一个精灵。当它更改为另一个精灵时,它也会更改其比例 我希望代码执行的操作=在更改为其他精灵之前,在水平轴上向左移动 我尝试过线性插值lerp和transform.translate public class Transitions : MonoBehaviour { public Sprite Pokemon_0; // VARIAB
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;
}
}
执行时,此代码确实会更改口袋妖怪和比例。然而,情况依然如此
我是一个新手,所以我一直在尝试不同的建议,谢谢。在您的代码示例中,您使用的位置x值似乎有所不同。x y和z值一起用于形成一个点,该点在三维环境中表示。每次将x值更改为1时,将对象的位置设置为其先前的位置将在水平轴上将其锁定 可以使用插值平滑两个位置状态之间的过渡,也可以使用Unity的内置Vector3.MoveToward或Vector2(如果在二维景观中) 插值 您所需的位置就是您要更改到的确切位置。您当前的位置将是transform.position 走向
在代码示例中,您使用的位置x值似乎有所不同。x y和z值一起用于形成一个点,该点在三维环境中表示。每次将x值更改为1时,将对象的位置设置为其先前的位置将在水平轴上将其锁定 可以使用插值平滑两个位置状态之间的过渡,也可以使用Unity的内置Vector3.MoveToward或Vector2(如果在二维景观中) 插值 您所需的位置就是您要更改到的确切位置。您当前的位置将是transform.position 走向
最好使用两个引擎,比如 如果您安装了Dotween,那么您只需使用
transform.DOMove(new vector3(1 ,0 , 1) , duration);
您还可以为青少年设置轻松。或使用完整的功能
transform.DOMove(new vector3(1 ,0 , 1) , duration)
.SetEase(Ease.OutCubic)
.OnCompelete(() => { shouldClose = true; });
您还可以为tween设置循环。SetLoops-1。最好使用tween引擎,如 如果您安装了Dotween,那么您只需使用
transform.DOMove(new vector3(1 ,0 , 1) , duration);
您还可以为青少年设置轻松。或使用完整的功能
transform.DOMove(new vector3(1 ,0 , 1) , duration)
.SetEase(Ease.OutCubic)
.OnCompelete(() => { shouldClose = true; });
您也可以为您的tween.SetLoops-1设置循环。您确实应该使用Lerp:您可以发布一个最小的可复制示例吗?我想在这种情况下,它至少是整个类代码。给它一个刚体和力?添加1个单元也可能比每帧添加1个单元多一点。。如果你得到200fps,它就会飞过更新方法中的代码?@DmitriyPopov Hi,刚刚发布了整个类,并解释了它的功能。我愿意接受建议。你确实应该使用Lerp:你能发布一个最小的可复制的例子吗?我想在这种情况下,它至少是整个类代码。给它一个刚体和力?添加1个单元也可能比每帧添加1个单元多一点。。如果你得到200fps,它就会飞过更新方法中的代码?@DmitriyPopov Hi,刚刚发布了整个类,并解释了它的功能。我愿意接受建议。嗨,我刚试过你的两种方法。不幸的是,它们不适合我。看起来他们好像什么都没做。我的精灵呆在同一个地方。我刚刚用我的全班同学更新了这篇文章,并解释了代码的作用,任何帮助都将不胜感激。Lerp需要起点和终点,而不是当前和终点。它也应该有办法在某个时候达到1。MoveToward被设置为执行非常小的动作。@Everts谢谢,我已经更新了答案。只要精灵在带有脚本的游戏对象上,它就应该工作。如果这似乎没有任何作用,请尝试将步长变量更改为更大的值。lerp的问题是,对象一开始会移动得很快,然后朝目标移动得很慢,当它越来越近时,移动得很慢。这是因为每次移动都是剩余距离的一小部分。所以它是一个极限。所需要的是增加比率,使其达到1并完成移动。嗨,刚刚尝试了两种方法。不幸的是,它们不适合我。看起来他们好像什么都没做。我的精灵呆在同一个地方。我刚刚用我的全班同学更新了这篇文章,并解释了代码的作用,任何帮助都将不胜感激。Lerp需要起点和终点,而不是当前和终点。它也应该有办法在某个时候达到1。MoveToward被设置为执行非常小的动作。@Everts谢谢,我已经更新了答案。只要精灵在带有脚本的游戏对象上,它就应该
奥克。如果这似乎没有任何作用,请尝试将步长变量更改为更大的值。lerp的问题是,对象一开始会移动得很快,然后朝目标移动得很慢,当它越来越近时,移动得很慢。这是因为每次移动都是剩余距离的一小部分。所以它是一个极限。所需要的是增加比率,使其达到1并完成移动。