Roll Ball 案例(其三)
往期链接:
Roll Ball 案例(其一)
Roll Ball 案例(其二)
第一节通过键盘监听来给小球施加力,从而控制小球移动。
第二节我们控制相机跟随、添加墙和金币旋转
这一节学习物体之间的碰撞和触发、如何删除物体,以及简单的UI制作
学习的视频链接为:视频链接
官网链接为:链接
继续学习。
P33 碰撞检测
如何知道小球与金币发生了触碰?
需要用到系统方法OnCollisionEnter
或OnCollisionExit
或OnCollisionStay
,当发生碰撞时,自动执行这些方法。
- 当与其他物体刚接触的时候执行方法
OnCollisionEnter
。- 当与其他物体持续接触时执行方法
OnCollisionStay
。- 当与其他物体离开接触时执行方法
OnCollisionExit
。
在Player脚本下添加以下代码:
private void OnCollisionEnter(Collision collision)
{
Debug.Log("发生碰撞");
}
P34 判断物体/销毁物体
获取到是和哪个碰撞器发生碰撞:collision.collider
获取到是和哪个游戏物体发生碰撞:collision.gameObject
获取物体标签:collision.gameObject.tag
销毁物体:Destroy(collision.gameObject)
使物体不激活(推荐使用):collision.gameObject.SetActive(false);
代码如下:
private void OnCollisionEnter(Collision collision)
{
Debug.Log("发生碰撞");
//通过碰撞讯息collision来获取碰撞到的是谁
if(collision.gameObject.tag == "Coin")
{
//Destroy(collision.gameObject); //直接销毁物体
//collision.collider.gameObject.SetActive(false);
//让物体处于未激活状态,在场景中依旧存在但不被激活
collision.gameObject.SetActive(false);
}
}
P35 去除碰撞时停顿/ 触发检测
吃游戏奖励时通常直接穿过去,而不是被物体挡住一下再吃掉物体。
触发检测
碰撞检测:判断某个物体是否和其他物体发生碰撞
触发检测:判断某个物体是否进入了某个区域
将 Is Trigger (是否是触发器) 勾选即可。
触发器的检测方法:
- 刚进入触发器时执行
OnCollisionEnter
。- 当在触发器内时执行
OnCollisionStay
。- 离开触发器时执行
OnCollisionExit
。
当设置成触发器后,碰撞器的检测代码就不会生效了,生效的是触发器的检测代码。
private void OnTriggerEnter(Collider other)
{
Debug.Log("OnTriggerEnter: " + other.gameObject.tag);
if (other.gameObject.tag == "Coin")
{
//让物体处于未激活状态
other.gameObject.SetActive(false);
}
}
P36 计分/ UI
在场景中创建UI/旧文本
,会自动生成Canvas(画布),EventSystem是UI的事件系统
将游戏设置成2D模式来编辑UI。
旧的Text的常用的简单设置有:位置、宽高、Text Input、居中对齐等。
Text可以设置锚点,将锚点设置为右上角,将text也放在右上角,可以暂时不考虑UI适配的问题(以后单独出一版讲UI适配)。
声明文本组件:public Text textScore;
获取想要的文本组件:
textScore = GameObject.Find("Text_Score").GetComponent<Text>();
在触发器事件中加分,修改文本:textScore.text = "Score: " + score;
到目前位置,总的代码如下:
public class Player : MonoBehaviour
{
public Rigidbody rd;
public int score = 0;
public Text textScore;
void Start()
{
rd = GetComponent<Rigidbody>();
textScore = GameObject.Find("Text_Score").GetComponent<Text>();
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(h,0,v) * 2); //施加两倍的力
}
private void OnTriggerEnter(Collider other)
{
Debug.Log("OnTriggerEnter: " + other.gameObject.tag);
if (other.gameObject.tag == "Coin")
{
//让物体处于未激活状态
other.gameObject.SetActive(false);
score++;
textScore.text = "Score: " + score;
}
}
}
学习愉快,下期见!