วันอังคารที่ 30 ธันวาคม พ.ศ. 2557

แชร์โค้ด Unity : บอลเด้งขอบจอ

ปัญหาใหญ่ของการทำการเด้งแบบนี้คือถ้าเราใช้การเด้งกับ collider ตามปกติ เราจะไม่รู้ว่าขอบจออยู่ตรงไหนเราเอา collider ไปวางไม่ถูกที่เพราะจอของแต่ละเครื่องมันอัตราส่วนหรือขนาดไม่เท่ากัน เลยเลยใช้คำสั่ง Camera.main.ScreenToWorldPoint() เพื่อหาตำแหน่งขอบจอแล้วนำมากำหนดระยะการเด้งของลูกบอล โค้ดอาจจะยาวๆก็ลองแกะกันดูเนาะ โค้ดส่วนนี้ได้เอาไปใช้งานจริงในเกม Kick it Up! บน Android ก็ลองเล่นกันดูได้



วิธีใช้
ใน obj จะต้องมี rigidbody2D ติดอยู่ด้วยถึงจะใช้โค้ดนี้ได้
สามารถใส่ค่า radius ปรัขนาดบอลได้

โค้ด edgeBounce.cs

using UnityEngine;
using System.Collections;

public class edgeBounce : MonoBehaviour
{
    public float radius;
    float top, buttom;

    void Start()
    {
        transform.localScale = new Vector3(radius * 2, radius * 2, radius * 2);

        top = Camera.main.ScreenToWorldPoint(new Vector3(0, Screen.height, 0)).y - radius;
        buttom = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, 0)).y + radius;
        //all calculated with radius different
    }

    void Update()
    {
        //Left Edge
        if (Camera.main.WorldToScreenPoint(transform.position + Vector3.left * radius).x < 0 && rigidbody2D.velocity.x < 0)
        {
            soundManager.CallFunction(1, 2);
            rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x * -1, rigidbody2D.velocity.y);
        }

        //Right Edge
        if (Camera.main.WorldToScreenPoint(transform.position + Vector3.right * radius).x > Screen.width && rigidbody2D.velocity.x > 0)
        {
            soundManager.CallFunction(1, 2);
            rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x * -1, rigidbody2D.velocity.y);
        }

        //Top Edge
        if (Camera.main.WorldToScreenPoint(transform.position + Vector3.up * radius).y > Screen.height && rigidbody2D.velocity.y > 0)
        {
            soundManager.CallFunction(1, 2);
            rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, rigidbody2D.velocity.y * -1);
        }

        //Buttom Edge
        if (transform.position.y < buttom && rigidbody2D.velocity.y < 0)
        {
            rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, rigidbody2D.velocity.y * -1);
            transform.position = new Vector3(transform.position.x, buttom, 0);
        }
    }
}

#2 สารบัญแชร์โค้ด