ปัญหาใหญ่ของการทำการเด้งแบบนี้คือถ้าเราใช้การเด้งกับ 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 สารบัญแชร์โค้ด