繁体   English   中英

Unity:在代码中的游戏对象上设置“位置轴心”会将其移动到错误的坐标

[英]Unity: Setting Position Axist on gameobject in code moves it to wrong coordinates

我的游戏中有一朵乌云,从右向左移动。 在撞上撞机之前-刚好应该将这台撞机带回原来的状态。 因此,云在场景中不断循环。

我有两个问题:

  1. 对我而言,最佳方法是为云提供一个“扩展区”,在撞击重置对撞机后才在其中生成。 但是,我没有找到有关产卵区的任何信息。

  2. 因此,我决定仅在对撞机触发后更改代码中的位置值。 好吧,云被设置为一个不同的空间,而不是我给它的坐标。

在两个示例中,仅更改云的X位置很重要。 高度(Y)和深度(Z)应该保持相同。

这是我所达到的,并且无法达到预期的效果:

public class CloudScript : MonoBehaviour
{
    public float moveSpeed;

    void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.gameObject.name == "Reset Clouds Collider") // detect collision with ground game object 
        {
            float tempY = transform.position.y;
            float tempZ = transform.position.z;
            transform.localPosition = new Vector3(5, tempY, tempZ);
        }
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
    }
}

在此脚本中,我希望云保持其Y和Z位置,只是将X更改为5。但是,云在Y = 5时以及在转换程序转到Y = 4之后开始。 在另一个周期后,Y = 3。...Z也从1开始设置为0。

有人可以帮我吗? 不能那么努力:)

谢谢 :)

使用localPosition ,还必须从localPosition获取临时值

float tempY = transform.localPosition.y;
float tempZ = transform.localPosition.z;
transform.localPosition = new Vector3(5, tempY, tempZ);

为了重置到初始位置,您还可以简单地将其存储,例如在Start (取决于您的需要,也可以OnEnable其设为OnEnable或通过公共方法),例如

private Vector3 initPosition;

private void Start()
{
    // store original position
    initPosition = transform.localPosition;
}

而不是简单地重置为那个

void OnTriggerEnter2D(Collider2D collider)
{
    // detect collision with ground game object
    if (collider.gameObject.name == "Reset Clouds Collider")  
    {
        // restore original position
        transform.localPosition = initPosition;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM