zoukankan      html  css  js  c++  java
  • Unity3D入门(二):碰撞检測

    碰撞器由来

    1.系统默认会给每一个对象(GameObject)加入一个碰撞组件(ColliderComponent),一些背景对象则能够取消该组件。

    2.在unity3d中,能检測碰撞发生的方式有两种,一种是利用碰撞器,还有一种则是利用触发器。这两种方式的应用很广泛。为了完整的了解这两种方式,我们必须理解下面概念:
    (一)碰撞器是一群组件,它包括了非常多种类,比方:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
    (二)所谓触发器,仅仅须要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框
    (三)在Unity3d中,主要有下面接口函数来处理这两种碰撞检測:

    触发信息检測:
    1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
    2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
    3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

    碰撞信息检測:
    1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
    2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
    3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器


    碰撞使用场景

    1.给主角加入刚体(Rigidbody)组件,而且取消刚体组件的重力选项UseGravity。

    2.主角碰到一些物体后会有一系列反应。举例,完雷电游戏时,飞机能够获取一些加速球能量球,碰到这些球体,飞机自身属性会有所提高
    下图:蓝色球为“加速球”,红色球为能量球,的当飞机接触球体时,属性就会添加



    主角的脚本代码例如以下:
    using UnityEngine;
    using System.Collections;
    
    public class Hero : MonoBehaviour {
    
        private float move_v = 0;//纵向移动距离
        private float move_h = 0;//横向移动距离
        public float m_speed = 1.5f;//移动速度
        public float m_power = 1.0f;//飞机的威力能量
        private Transform m_transform;
    
    	void Start () {
            m_transform = this.transform;
    	}
    	
    	
    	void Update () {
            Move();
    	}
    
       
       //飞机与物体发生碰撞,须要推断碰撞体是什么类型
        void OnTriggerEnter(Collider e)
        {
            if (e.gameObject.tag.CompareTo("tagSpeedBall")==0)
            { 
                Debug.Log("捡到加速球");
                m_speed += 5;//速度+2
                Destroy(e.gameObject);//销毁加速球
            }
    
            if (e.gameObject.tag.CompareTo("tagPowerBall") == 0)
            {
                Debug.Log("捡到能量球");
                m_power += 2;//威力+2
                Destroy(e.gameObject);//销毁能量球
            }
        }
        //移动方法
        void Move()
        {
            //向上
            if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
            {
                //移动距离
                m_transform.Translate(-Vector3.forward * Time.deltaTime * m_speed);
    
            }
            //向下
            if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
            {
    
                m_transform.Translate(Vector3.forward * Time.deltaTime * m_speed);
    
            }
    
            //向左
            if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
            {
    
                m_transform.Translate(Vector3.right * Time.deltaTime * m_speed);
            }
    
            //向右
            if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
            {
    
                m_transform.Translate(Vector3.left * Time.deltaTime * m_speed);
            }
    
        }
    
    }



  • 相关阅读:
    判断字符串是否为空
    NameVirtualHost *:80 has no VirtualHosts
    angular笔记
    Angular *ngIf length
    angular 8 表单带文件上传接口
    angular8 大地老师学习笔记---第十课
    angular8 大地老师学习笔记---第九课
    angular8 大地老师学习笔记---第八课
    angular8 大地老师学习笔记---第六课
    记录一下网上找到的别人写的angualr总结
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4378628.html
Copyright © 2011-2022 走看看