如何确定比例以将精灵宽度增加到屏幕宽度

时间:2016-05-24 12:47:00

标签: c# unity3d unity5

我正在尝试在Unity中实现与How to increase (animate) the width of the square on both ends类似的功能。如何确定增加(精灵的)宽度以满足整个屏幕宽度的比例?

更新

下面是我为实现扩展精灵宽度以实现全屏宽度而实现的Swift代码:

       func expandEnemy () {

         spritePosBeforeScaleX = CGPointMake((enemy?.sprite.position.x)!, (enemy?.sprite.anchorPoint.y)!)

         enemy?.sprite.anchorPoint = CGPointMake((enemy?.sprite.position.x)! / self.size.width, (enemy?.sprite.anchorPoint.y)!)
         let enemyScalingAction = SKAction.scaleXTo(self.size.width / (enemy?.sprite.size.width)!, duration: 1.0)
         enemy!.sprite.runAction(enemyScalingAction)

         delay(0.1)  
         {
            center = CGPointMake(enemy!.sprite.size.width / 2 - (enemy!.sprite.size.width * enemy!.sprite.anchorPoint.x), enemy!.sprite.size.height / 2 - (enemy!.sprite.size.height * enemy!.sprite.anchorPoint.y))
            enemy!.sprite.physicsBody = SKPhysicsBody(rectangleOfSize: enemy!.sprite.size, center: center)
         }
        }

2 个答案:

答案 0 :(得分:2)

这一切都取决于屏幕的宽高比和SpriteRenderer对象的大小。你需要扩大持有spriterenderer的游戏对象,并考虑这些因素。

[ExecuteInEditMode]
public class SpriteToScreen : MonoBehaviour {
public float sprw = 256f;
public float sprh = 256f;
float unitspp = 100f;
public float scrw = 0f;
public float scrh = 0f;
public float aspect = 0f;
public float spr_aspect = 1f;
public float factorY = 0.017578125f;
public void Update(){
    scrw = Screen.width;
    scrh = Screen.height;
    aspect = scrw / scrh;
    unitspp = this.GetComponent<SpriteRenderer>().sprite.pixelsPerUnit;
    sprw = this.GetComponent<SpriteRenderer>().sprite.bounds.size.x * unitspp;
    sprh = this.GetComponent<SpriteRenderer>().sprite.bounds.size.y * unitspp;
    spr_aspect = sprw / sprh;
    this.transform.localScale = new Vector3( (1152f / sprh * aspect) / spr_aspect,
        1152f / sprh, 
        1 );
}

}

答案 1 :(得分:0)

您可以在x轴全屏幕中缩放UI的Image。只需获取RectTransform,然后将其sizeDelta属性修改为设备的屏幕大小或Canvas的大小。

以下功能可以在x,y或x和y轴全屏幕上缩放Unity UI Image。要扩展的Image必须位于Canvas之下。将Sprite分配给Source Image组件的Image,以下代码应该有效。

//在此处的编辑器中将UI图像附加到scacle

public GameObject image;

缩放

3 秒内以X轴全屏缩放:

StartCoroutine(scaleToFullScreen(image, 0, 3f));

3 秒内按Y轴全屏缩放:

StartCoroutine(scaleToFullScreen(image, 1, 3f));

3 秒内以X轴和Y轴全屏缩放:

StartCoroutine(scaleToFullScreen(image, 2, 3f));

比例功能

bool isScaling = false;
IEnumerator scaleToFullScreen(GameObject imageToScale, int scaleType, float byTime)
{
    if (isScaling)
    {
        yield break;
    }

    if (scaleType < 0 || scaleType > 2)
    {
        Debug.Log("Invalid ScaleType. Valid Scale Types X:0,  Y:1,  XandY:3");
        yield break;
    }
    isScaling = true;

    Canvas canvas = imageToScale.GetComponentInParent<Canvas>();
    float x, y;

    if (canvas != null)
    {
        x = canvas.pixelRect.width;
        y = canvas.pixelRect.height;
    }
    else
    {
        x = Screen.width;
        y = Screen.height;
    }

    RectTransform rect = imageToScale.GetComponent<RectTransform>();
    if (rect == null)
    {
        rect = imageToScale.AddComponent<RectTransform>();
    }

    //Center the position of the image so that it will be resized equally
    rect.anchoredPosition3D = new Vector3(0, 0, rect.anchoredPosition3D.z);


    //The default Size
    Vector2 originalScale = rect.sizeDelta;

    //The new scale we want to scale texture to
    Vector2 newScale = originalScale;

    if (scaleType == 0)
    {
        newScale.x = x;
    }
    else if (scaleType == 1)
    {
        newScale.y = y;
    }
    else if (scaleType == 2)
    {
        newScale.x = x;
        newScale.y = y;
    }


    float counter = 0;
    while (counter < byTime)
    {
        counter += Time.deltaTime;
        rect.sizeDelta = Vector2.Lerp(originalScale, newScale, counter / byTime);
        yield return null;
    }
    isScaling = false;
}