重力と投げる|Unity5 : ZIPファイル(11.6MB)
ボールをマウスで投げる。
C#
ThrowingGravity.cs
using UnityEngine; using System.Collections; public class ThrowingGravity : MonoBehaviour { // Rigidbody2D rib; Vector2 sprite; Vector2 lt; Vector2 lb; Vector2 rt; Vector2 rb; float offsetX; float offsetY; float downX; float downY; float vx = 0; float vy = 0; float dist = 0; float rad = 0; //float d = 1f; bool ballFlag = true; float width = 0; float gravity = -0.003f; float bounce = -0.7f; Collider2D aCollider2d; void Start () { //rib = GetComponent<Rigidbody2D>(); //rib.isKinematic = true; // 重力の無効化 //d = 10.0f * Time.deltaTime; sprite = transform.position; // カメラのビューポートの範囲(左、右、トップ、ボトム)を取得 lt = Camera.main.ViewportToWorldPoint (new Vector2 (0, 0)); lb = Camera.main.ViewportToWorldPoint (new Vector2 (0, 1)); rt = Camera.main.ViewportToWorldPoint (new Vector2 (1, 0)); rb = Camera.main.ViewportToWorldPoint (new Vector2 (1, 1)); // ボールの半径を取得 width = GetComponent<SpriteRenderer> ().bounds.size.x; width = width / 2; } // Update is called once per frame void FixedUpdate () { Vector2 tapPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition); aCollider2d = Physics2D.OverlapPoint(tapPoint); if(Input.GetMouseButtonDown(0)){ if (aCollider2d) { ballFlag = false; float dx = tapPoint.x - sprite.x; float dy = tapPoint.y - sprite.y; float rad = Mathf.Atan2 (dy, dx); float dist = Mathf.Sqrt (dx * dx + dy * dy); offsetX = Mathf.Cos (rad) * dist; offsetY = Mathf.Sin (rad) * dist; downX = offsetX; downY = offsetY; } else { ballFlag = true; } } if(Input.GetMouseButton(0)){ if (aCollider2d) { ballFlag = false; sprite.x = tapPoint.x - offsetX; sprite.y = tapPoint.y - offsetY; vx = (sprite.x - downX) * 1f; vy = (sprite.y - downY) * 1f; transform.position = sprite; downX = sprite.x; downY = sprite.y; } } if (Input.GetMouseButtonUp (0)) { ballFlag = true; float dx = sprite.x - downX; float dy = sprite.y - downY; } if (ballFlag) { vy += gravity; sprite.x += vx; sprite.y += vy; //GetComponent<Rigidbody2D>().velocity=sprite; //GetComponent<Rigidbody2D> ().AddForce (new Vector2 (vx, vy)); if (sprite.x < lt.x+width) { sprite.x = lt.x+width; vx *= bounce; } else if (sprite.x > rt.x-width) { sprite.x = rt.x-width; vx *= bounce; } if (sprite.y < lt.y+width) { sprite.y = lt.y+width; vy *= bounce; } else if (sprite.y > lb.y-width) { sprite.y = lb.y-width; vy *= bounce; } transform.position = sprite; } } }