unity之MonoBehaviour


1.鼠标进入物体(这个物体是GUI元素或者带有Collider)时调用:

  //鼠标不用点,这个物体不用加rigidbody
    void OnMouseEnter() {

        Debug.Log("鼠标进入小块了");
    }
  //鼠标悬浮
    void OnMouseOver() 
    { 
    }

    //鼠标按下
    void OnMouseDown()
    { 
    }

    //鼠标抬起
    void OnMosueUp()
    {
    }

    //当鼠标在这个物体上按下,并且在这个物体上抬起时调用
    void OnMosueUpAsButton() 
    {
    }
    void OnMouseDrag() {
        //切水果可以用这个
        Debug.Log("别拽我");
    
    }
2.触发检测

collider必须勾选上Is Trigger选项,下列的方法才能被触发

    //进入物体范围
    void OnTriggerEnter(Collider other) 
    { 
    }
    //collider停止触发时
    void OnTriggerExit(Collider other)
    {
    }
    //collider接触触发器时,每一帧调用
    void OnTriggerStay(Collider other)
    { 
    }

3.碰撞检测

物体之间发生碰撞,必须有一个碰撞发起者,也就是挑事的那个物体

碰撞发起者特征:带有Rigidbody或者Character Controller

碰撞的受害者特征:带有Collider组件

先简单的总结一下带有Rigibody的碰撞

    //刚开始碰撞
    void OnCollisionEnter(Collision other)
    { 
    }
    //停止碰撞
    void OnCollisionExit(Collision other)
    {
    }
    //发生碰撞时,每一帧被调用
    void OnCollisionStay(Collision other)
    {
    }
带有Character Controller(人形碰撞器)的物体,它就不受力的影响了,并且它加上Rigidbody也没用

它通常的做法是给与之碰撞的物体加上Rigidbody,在带有人形碰撞器的脚本中,使用它自带的一个碰撞方法,当触发这个方法时,获取到与之相撞的物体的Rigidbody,然后设置力什么的

    void OnControllerColliderHit(ControllerColliderHit hit)
    {

        Debug.Log("Controller撞上别的啦");
        hit.collider.gameObject.GetComponent<Rigidbody>().AddForce(0, 0, 2f);
    }
注:通常我们使用键盘按键改变物体的坐标可以用Transform,但是带有Character Controller的物体只能使用Character Controller的Move方法才算移动,两个物体想接触时才能发生碰撞效果

public class IamCharacter : MonoBehaviour
{

    float x;
    float y;
    private CharacterController character;
    void Start()
    {
        character = this.GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        //这种方法及时能控制物体的移动,但是两个物体相接触时,并不会调用OnControllerColliderHit方法
        //x = Input.GetAxis("Horizontal");
        //y = Input.GetAxis("Vertical");
        // //this.transform.position = new Vector3(this.transform.position.x+x,0,y+this.transform.position.z);
        // this.transform.Translate(x,0,y);

        if (Input.GetKey(KeyCode.W))
        {
            character.Move(transform.forward * 0.1f);
        }
        if (Input.GetKey(KeyCode.A))
        {
            character.Move(-transform.right * 0.1f);
        }
        if (Input.GetKey(KeyCode.S))
        {
            character.Move(-transform.forward * 0.1f);
        }
        if (Input.GetKey(KeyCode.D))
        {
            character.Move(transform.right * 0.1f);
          
        }
    
    }



    void OnControllerColliderHit(ControllerColliderHit hit)
    {

        Debug.Log("Controller撞上别的啦");
        hit.collider.gameObject.GetComponent<Rigidbody>().AddForce(0, 0, 2f);
    }

4.粒子碰撞

这个脚本要加在粒子对象身上,并且要勾选上粒子属性里的Collision。把Collision中的第一个参数改为World,并勾选上Send Collision Message

    void OnParticleCollision(GameObject other) 
    {
        Debug.Log("粒子撞上别的了");
     }
5.绘制Gizmos,Gizmos是一个可视化辅助设置类,也就是用来画图的,在Scene场景里能看见,但在game场景里看不见

    //绘制Gizmos,可视话辅助设置类
    //每一帧调用
    void OnDrawGizmos() 
    {
        //这个a.png必须在Gizmos目录下
      Gizmos.DrawIcon(this.transform.position,"a.png");
     }
    //只有物体被选择的时候才被调用
    void OnDrawGizmosSelected() 
    {
       Gizmos.color = Color.white;
     }

6.InVoke

    public GameObject cube;
	void Start () {
        //在游戏开始后3f开始调用,之后每4f调用一次这个方法,它跟Start方法没关系了,自己独立调用,这个方法通常放在start或Awake方法里
        //如果放在Update方法里,当到达3f时,这个方法开始调用。Update下一帧又开始调用这个方法,也就是有好几个这个方法(CubeInstance方法)执行每4f调用一次。就混乱了
        //应用:计时器
   //     InvokeRepeating("CubeInstance", 3f, 4f);

        //应用场景:刚进入游戏时,在经过了5秒后,开始生怪物或者生成障碍物
        //      Invoke("CubeInstance", 3f);//在3f之后开始像调正常方法一样,调用这个方法,这个3f只有在第一次调用时可以停3f有效
        //if (Input.GetKeyDown(KeyCode.V)) {

        //    CancelInvoke();//停止调用
        //     CancelInvoke("CubeInstance");//只能停掉invoke
        //       }
        print("start");
	}
	



    void CubeInstance() {
   //     print(Time.time);
    //    Instantiate(cube);
      
    
    }





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值