Unity学习(04)

Roll Ball 案例(其三)

往期链接:
Roll Ball 案例(其一)
Roll Ball 案例(其二)
第一节通过键盘监听来给小球施加力,从而控制小球移动。
第二节我们控制相机跟随、添加墙和金币旋转
这一节学习物体之间的碰撞和触发、如何删除物体,以及简单的UI制作
学习的视频链接为:视频链接
官网链接为:链接

继续学习。

P33 碰撞检测

如何知道小球与金币发生了触碰?
需要用到系统方法OnCollisionEnterOnCollisionExitOnCollisionStay,当发生碰撞时,自动执行这些方法。

  • 当与其他物体刚接触的时候执行方法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;
        }
    }

}

学习愉快,下期见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值