【问题标题】:How to scale and rotate a sprite between two points based on distance如何根据距离在两点之间缩放和旋转精灵
【发布时间】:2020-05-18 23:01:53
【问题描述】:

我正在统一开展一个项目,我有一个小圆圈显示将施加到球上的功率和显示方向的箭头。

圆圈和箭头是为了扩大到最大距离;箭头缩放但它太大(占据屏幕的一半)并且不能正确旋转;圆圈根本没有缩放。我试图改变箭头的局部比例并弄乱了各种值,但我不知道该怎么做。只有当光标在左上角且箭头在右下角时,箭头才会朝向正确的方向。

A点和B点这两个点是两个空对象; B点附着在球上,A点跟随鼠标。当球被点击并且光标被拖走时,pointB向相反的方向移动;我试图让箭头始终面向 B 点或从球的另一侧指向 B 点。

除了箭头和圆形旋转和缩放之外的所有东西都有效。我对代码很陌生,不了解 Mathf.Log。箭头旋转和缩放代码被注释掉,因为我目前正试图让圆圈工作。

如果您能指出正确的方向或帮助解决其中一个问题,我将不胜感激。

public class PlayerBallHit : MonoBehaviour
{

    private GameObject mousePointA;
    private GameObject mousePointB;
    private GameObject arrow;
    private GameObject circle;

    // calc distance
    private float currDistance;
    public float maxDistance = 3f;

    private float spaceLimit;
    private float shootPower;
    public float shootPowervar;

    public Vector2 shootDirection;
    void Start()
    {

    }

    void Awake()
    {
        mousePointA = GameObject.FindGameObjectWithTag("PointA");
        mousePointB = GameObject.FindGameObjectWithTag("PointB");
        arrow = GameObject.FindGameObjectWithTag("Stick");
        circle = GameObject.FindGameObjectWithTag("Circle");
    }

    private void OnMouseDrag()
    {
        currDistance = Vector2.Distance(mousePointA.transform.position, transform.position);

        if (currDistance <= 3f)
        {
            spaceLimit = currDistance;
        }
        else
        {
            spaceLimit = maxDistance;
        }

        // Direction of Hit and Circle

        StrDirMarkers();

        // calc Power & Direction

        shootPower = Mathf.Abs(spaceLimit) * shootPowervar;

        Vector3 dimxy = mousePointA.transform.position - transform.position;
        float difference = dimxy.magnitude;

        mousePointB.transform.position = (Vector3)transform.position + ((dimxy / difference) * currDistance * -1);
        mousePointB.transform.position = new UnityEngine.Vector3(mousePointB.transform.position.x, mousePointB.transform.position.y);

        shootDirection = (Vector2)Vector3.Normalize(mousePointA.transform.position - transform.position);
    }

    void OnMouseUp()
    {
        //arrow.GetComponent<SpriteRenderer>().enabled =false;
        circle.GetComponent<SpriteRenderer>().enabled = false;

        Vector2 push = shootDirection * shootPower *-1;

        GetComponent<Rigidbody2D>().AddForce(push, ForceMode2D.Impulse);
    }

    private void StrDirMarkers()
    {
        //arrow.GetComponent<SpriteRenderer>().enabled = true;
        circle.GetComponent<SpriteRenderer>().enabled = true;

        // calc position

        /*
        if (currDistance <= maxDistance)
        {
            arrow.transform.position = new Vector2((2f * transform.position.x) - mousePointA.transform.position.x, (2f * transform.position.y) - mousePointA.transform.position.y);
        }
        else
        {
            Vector2 dimxy = mousePointA.transform.position - transform.position;
            float difference = dimxy.magnitude;
            arrow.transform.position = (Vector2)transform.position + ((dimxy / difference) * maxDistance * -1);
            arrow.transform.position = new UnityEngine.Vector2(arrow.transform.position.x, arrow.transform.position.y);
        }
        */

        circle.transform.position = transform.position + new Vector3(0, 0, 0.04f);

        Vector3 dir = mousePointA.transform.position - transform.position;

        float rot; 

        if(Vector3.Angle(dir, transform.forward)> 90)
        {
            rot = Vector3.Angle(dir, transform.right);
        }else
        {
            rot = Vector3.Angle(dir, transform.right) * -1;
        }

        //arrow.transform.eulerAngles = new Vector3(0, 0, rot);

        // scale arrow

        float scaleX = Mathf.Log(1 + spaceLimit / 10000f, 2f) * 0.05f;
        float scaleY = Mathf.Log(1 + spaceLimit / 10000f, 2f) * 0.05f;

        //arrow.transform.localScale = new Vector3(1 + scaleX, 1 + scaleY, 0.001f);
        circle.transform.localScale = new Vector3(1 + scaleX, 1 + scaleY, 0.001f);
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    尝试使用此代码来缩放和旋转箭头

      Vector3 dir = mousePointA.transform.position - transform.position;
    
        float rot;
    
        if (mousePointA.transform.position.y >= transform.position.y)
        {
            rot = Vector3.Angle(dir, transform.position) * -1;
        }
        else
        {
            rot = Vector3.Angle(dir, transform.position);
        }
    
        arrow.transform.eulerAngles = new Vector3(0, 0, rot);
    
        // scale arrow
        float scaleValue = Vector3.Distance(mousePointA.transform.position, 
        transform.position);
        arrow.transform.localScale = new Vector3(1 + scaleValue, 
        arrow.transform.localScale.y, 1);
        circle.transform.localScale = new Vector3(1 + scaleValue * 0.05f, 1 + scaleValue * 
         0.05f, 0.001f);
    

    【讨论】:

    • 这种方式解决了缩放问题,但圆圈不会从球的中心缩放,也不会停止缩放;感谢您朝着正确的方向前进。主要问题是箭头,它沿 x 轴缩放并且不旋转,这可能是精灵和其他代码的问题,但再次感谢您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多