2016-05-24 6 views
3

UnityでHow to increase (animate) the width of the square on both endsと似たようなことを達成しようとしています。スクリーン幅全体を満たすために(スプライトの)幅を増やすスケールをどのように決定できますか?以下はスプライトの幅を画面の幅に拡大するスケールを決定する方法

UPDATE

私はフルスクリーン幅を取るためにスプライトの幅を拡大するために実装するためにスウィフトコードです:

 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) 
     } 
     } 
+0

あなたは説明できますこれを行う?多分これを達成するための別の方法があります。 – Programmer

+0

@Programmer私は、リンク内で行われたことを統一しています。画面の幅を占めるまで、両端の四角形(ゲームオブジェクト)の幅を広げます。 KnightOfDragonのアプローチは、アニメーションの効果を与えるために幅を拡大することでした。私は同じアプローチを使いたいと思っていましたが、私は、このアプローチが複数の色を持つスプライトにも問題があることに気がついたので、別のアプローチに慣れています。例えば、チェックされたブロックは良く見えません同様の方法で引き伸ばす)。これが私が達成しようとしていることのよりよい考えを与えることを願っています。 – NSSwift

+0

あなたは私の答えの一つにコメントをしました。それが私がここに来る方法です。あなたが片面だけを拡大すると、それは良く見えません。だから私はあなたがこれをしたい理由を尋ねた。 KnightOfDragonのアプローチについては、あなたがスケーリングを実行した場所のYouTubeのビデオとタイムラインを持っているなら、私は他の答えのコードでそれを行うことができるかどうかを見ていきます。私はスケーリング以外の何かがあるかどうかを見るためにこれを視覚化する必要があります。 – Programmer

答えて

2

これは、すべての画面のアスペクト比に依存し、 SpriteRendererでのオブジェクトのサイズ。 spriterendererを保持するgameobjectを、これらを考慮した要素でスケールアップする必要があります。

[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); 
} 

} 
0

UIのImageをx軸フルスクリーンで拡大縮小できます。 RectTransformを取得し、のプロパティをデバイスの画面サイズまたはCanvasのサイズに変更してください。

以下の機能は、Unity UI Imageをx、y、またはx軸とy軸の両方でフルスクリーンで拡大/縮小できます。縮尺に合わせてImageCanvas以下である必要があります。 をImageコンポーネントのSource Imageに割り当てると、以下のコードが有効になります。

//をスケールするためにここに

public GameObject image; 

エディタでscacleにUI画像を添付:

スケールをX軸フルスクリーンで秒で:

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

Y軸フルスケールでのスケール秒:

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

スケール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; 
} 
関連する問題