子对象相对于父对象的旋转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子对象相对于父对象的旋转相关的知识,希望对你有一定的参考价值。

我一直试图将玩家的枪支目标与玩家一起旋转。即使他面向左侧,我的球员也会向右侧射门。我创建了一个名为Firepoint的目标,它被设置为玩家的子对象。我希望它随着角色改变它的方向而改变。任何帮助表示赞赏。

enter image description here

这是播放器的代码。

 public void Move()
{
    float controlThrow = CrossPlatformInputManager.GetAxis("Horizontal"); 
    Vector2 playerVelocity = new Vector2(controlThrow * runSpeed, myRigidBody.velocity.y);
    myRigidBody.velocity = playerVelocity;

    bool playerHasHorizontalSpeed = Mathf.Abs(myRigidBody.velocity.x) > Mathf.Epsilon; 

    myAnimator.SetBool("Walking", playerHasHorizontalSpeed);
}

 public void Flipsprite()
{

    bool playerhashorizontalspeed = Mathf.Abs(myRigidBody.velocity.x) > Mathf.Epsilon;

    if (playerhashorizontalspeed)
    {
        transform.localScale = new Vector2(Mathf.Sign(myRigidBody.velocity.x), 1f);
        transform.rotation = new Vector2(Mathf.Sign(firePoint.transform.localScale.x), 1f);

    }


}
答案

这里的问题是旋转不受缩放的影响。只有相对的尺度和位置。

另外你为什么使用> Mathf.Epsilon而不仅仅是> 0。据我了解,你只需要检查它是否不是0 ...使用Mathf.Epsilon是如此小的差异,它实际上并不重要。

public void Move()
{
    float controlThrow = CrossPlatformInputManager.GetAxis("Horizontal"); 
    Vector2 playerVelocity = new Vector2(controlThrow * runSpeed, myRigidBody.velocity.y);
    myRigidBody.velocity = playerVelocity;

    bool playerHasHorizontalSpeed = Mathf.Abs(myRigidBody.velocity.x) > 0; 

    myAnimator.SetBool("Walking", playerHasHorizontalSpeed);
}

// store the last direction
int direction;

public void Flipsprite()
{
    bool playerhashorizontalspeed = Mathf.Abs(myRigidBody.velocity.x) > 0;

    if (playerhashorizontalspeed)
    {
        // update the direction
        direction = Mathf.Sign(myRigidBody.velocity.x);
        transform.localScale = new Vector2(direction, 1f);
    }
}

然后,当你射击时也会与direction相乘

private IEnumerator FireContinuously() 
{ 
    while (true) 
    { 
        GameObject laser = Instantiate(bullet, firePoint.position, firePoint.rotation); 
        laser.GetComponent<Rigidbody2D>().velocity = new Vector2(projectileSpeed * direction, 0); 
        yield return new WaitForSeconds(projectileFiringPeriod); 
    } 
}  

一个小提示:

如果你做的类型

public RigidBody2D bullet 

然后再拖动相应的预制件比你不需要使用GetComponent但可以直接使用

var laser = Instantiate(bullet, firePoint.position, firePoint.rotation);
laser.velocity = ...

以上是关于子对象相对于父对象的旋转的主要内容,如果未能解决你的问题,请参考以下文章

在css中 父元素不固定高度,怎样实现子元素的高度100

中心子 QMainWindow 相对于父 QMainWindow

子视图相对于父 UIView 的起源

[Unity3D]需要明白的基本知识点

offsetLeft和style.left的区别

如何在 PyQt5 中相对于父窗口移动子窗口?