笔记14 灯光、预设体、3d物体的事件、碰撞体、刚体、炸箱子、触发器、物理材质、射线

  • 灯光
    • 基本项
    • 烘焙
    • 灯光的种类
    • Lighting窗口
  • 预设体
    • 了解预设体
    • 利用代码操作预设体
      • 实例化预设体Instantiate
      • 删除
        • 删除物体
        • 3秒之后删除
        • 立刻删除
        • 删除组件
  • 3d物体的事件
    • 鼠标移动进物体,在物体范围内,离开物体
    • 鼠标按下,抬起,按下并抬起
    • 按下持续调用
  • 碰撞体、刚体
    • Unity里
    • 代码
      • 产生碰撞的时候会调用OnCollisionEnter
      • 当碰撞结束的时候会调用OnCollisionExit
      • 获得碰撞的物体的碰撞器,碰撞点,碰撞法线
      • 移动物体
        • 法一:无刚体时用。有刚体,速度特别快时,不能用(遇墙抖动)。
        • 法二:给力Rbody.AddForce(利用刚体,只给一次力。所以速度是越来越慢的)
        • 法三:给速度Rbody.velocity(利用刚体)
  • 炸箱子
    • 课程代码
    • 复习自写代码
  • 触发器
    • 进入触发区域调用
    • 离开触发区域调用
  • 物理材质
  • 射线
    • 画出射线
    • 检测碰撞
      • 法一:只显示第一个碰撞点
      • 法二:RaycastHit[]碰撞点的集合
    • 鼠标点在地面上
    • 物体向鼠标点击的位置移动
      • ==特别说明==
        • 法一:(ray, out hit)两个参数(会出现墙后位置不能到达的问题)
        • 法二:四个参数(指定与哪一层进行检测,解决墙后位置不能到达的问题)
          • 写法一:1<<8 查看地面是哪一层,把层数写在这里,此处为8.
          • 写法二:1<

灯光

基本项

烘焙

灯光的种类

Lighting窗口

预设体

了解预设体

利用代码操作预设体

实例化预设体Instantiate

    //预设体的类型也是GameObject,名字是CubePre。public GameObject CubePre;//注意这一步:在unity中,将预设体关联到脚本的变量上来。void Start () {/*法一:实例化到指定位置。
预设体,位置(中心),旋转(默认四元数。此处设为不转)。返回值是刚生成的物体。*/GameObject go = Instantiate(CubePre, transform.position, Quaternion.identity);//法二:不指定位置的实例化。Instantiate(CubePre);}

删除

位置:Start

删除物体

        /*删除物体。一般是在一帧完了之后删除。不能写在Update里,因为这个删除是有延迟的,和垃圾回收机制一样。*/Destroy(go);

3秒之后删除

        Destroy(go, 3f);   //3秒之后删除

立刻删除

       //立刻删除(强制删除)。可以写在Update里。费性能,少用。DestroyImmediate(go);

删除组件

        //删除组件。例如删除AudioSource组件Destroy(GetComponent<AudioSource>());

3d物体的事件

注意:该物体需勾已选碰撞器这个组件;在Game窗口进行操作

鼠标移动进物体,在物体范围内,离开物体

 //鼠标移动进物体private void OnMouseEnter(){Debug.Log("Enter");}//鼠标在物体范围内private void OnMouseOver(){Debug.Log("Over");}//鼠标离开物体private void OnMouseExit(){Debug.Log("Exit");}

鼠标按下,抬起,按下并抬起

//鼠标按下private void OnMouseDown(){Debug.Log("Down");}//鼠标抬起。如果按下是在物体上,那么一出物体时,抬起是调用的private void OnMouseUp(){Debug.Log("Up");}//按下并抬起(上面两个方法的结合)。按下并抬起必须都在物体身上private void OnMouseUpAssButton(){Debug.Log("Butten")}

按下持续调用

//按下持续调用(可用于拖拽,但拖拽更多是用射线)private void OnMouseDrag(){Debug.Log("Drag");}

碰撞体、刚体

两个物体产生碰撞的条件:两个物体都要有碰撞体,且至少一个有刚体。
注意:运行时添加的组件,在运行结束后会消失。

Unity里

代码

产生碰撞的时候会调用OnCollisionEnter

    //产生碰撞的时候会调用。/*unity里面的碰撞器是Collider,但代码中Colision是一个类,它里面包含一些数据信息。里面可以找到碰撞器、游戏物体、刚体等。 */private void OnCollisionEnter(Collision collision){}

当碰撞结束的时候会调用OnCollisionExit

 //当碰撞结束的时候会调用private void OnCollisionExit(Collision collision){Debug.Log("Exit");}

获得碰撞的物体的碰撞器,碰撞点,碰撞法线

    //产生碰撞的时候会调用。private void OnCollisionEnter(Collision collision){//获得碰撞的物体的碰撞器Collider collider = collision.collider;Debug.Log("Enter" + collider.name);   //此时获得的是地面//碰撞点。它是个数组,因为物体不同,碰撞点的个数不同。Vector3 point = collision.contacts[0].point;//碰撞法线Vector3 normal = collision.contacts[0].normal;}

移动物体

法一:无刚体时用。有刚体,速度特别快时,不能用(遇墙抖动)。

void Update () {//移动物体,法一:无刚体时用。有刚体,速度特别快时,不能用。向前每秒走十米   transform.Translate(transform.forward * 10 *Time.deltaTime);  }

法二:给力Rbody.AddForce(利用刚体,只给一次力。所以速度是越来越慢的)

    //移动物体,法二、法三:利用刚体private Rigidbody Rbody;void Start () {//先得到物体身上的刚体组件Rbody = GetComponent<Rigidbody>();//法二:给力(给一次。所以速度是越来越慢的 )。方向(前方向量)* 力Rbody.AddForce(transform .forward * 300f);       }

法三:给速度Rbody.velocity(利用刚体)

    //移动物体,法二、法三:利用刚体private Rigidbody Rbody;void Start () {//先得到物体身上的刚体组件Rbody = GetComponent<Rigidbody>();}void Update () {/*移动物体,法三:给速度。velocity代表当前物体的速度。transform.forward我的前方,如果是会滚动的物体,那么它的前方是会发生改变,所以注意是否需要锁定滚动。*/Rbody.velocity = transform.forward * 10;//匀速移动。Vector3.forward世界的前方,方向不会变。Rbody.velocity = Vector3.forward * 10;}

炸箱子

课程代码

    //产生碰撞的时候会调用。/*unity里面的碰撞器是Collider,但代码中Colision是一个类,它里面包含一些数据信息。里面可以找到碰撞器、游戏物体、刚体等。 */private void OnCollisionEnter(Collision collision){//爆炸范围半径5mfloat r = 5;//Physics物理的类,它有很多方法,比如此处的OverlapSphere。//得到圆心为collision.contacts[0].point,半径为r的圆中间的所有碰撞体。Collider[] colliders = Physics.OverlapSphere(collision.contacts[0].point,r);//在unity里面把箱子的标签统一成Box//遍历碰撞体foreach(Collider collider in colliders){//判断是不是可以被击飞的箱子if(collider.tag == "Box"){/*给箱子添加爆炸力。首先拿它的刚体GetComponent,然后给它一个爆炸力AddExplosionForce,参数:力(50),爆炸点(圆心),半径(r)*/collider.GetComponent<Rigidbody>().AddExplosionForce(500f, collision.contacts[0].point, r);}}

复习自写代码

   //产生碰撞时调用void OnCollisionEnter(Collision collision){//爆炸半径float radius = 5f;//爆炸点Vector3 point = collision.contacts[0].point;//拿到要炸的物体Collider[] colliders = Physics.OverlapSphere(point, radius);//遍历物体,找到要炸的for(int i = 0; i < colliders.Length; i++){if (colliders[i].CompareTag("Box")){//给爆炸力colliders[i].GetComponent<Rigidbody>().AddExplosionForce(500f, point, radius);}}}

触发器


下面的实例中,脚本在球上,让球穿过立方体,立方体的触发器应该打上勾。

进入触发区域调用

 //进入触发区域调用。other代表你(球)进入的那个物体(立方体)的触发器private void OnTriggerEnter(Collider other){//打印触发器的名字,结果是立方体Debug.Log("Enter" + other.name); }

离开触发区域调用

     //离开触发区域调用private void OnTriggerExit(Collider other){Debug.Log("Exit");}

物理材质

射线

画出射线

 void Start () {//射线。射线的起始点,射线向量。从003的点向下4米的射线。Ray ray = new Ray(Vector3.up * 3, Vector3.down * 4);}void Update () {//画出射线Debug.DrawRay(Vector3.up * 3, Vector3.down * 4);                    }

检测碰撞

法一:只显示第一个碰撞点

   void Start () {//射线。射线的起始点,射线向量。从003的点向下4米的射线。Ray ray = new Ray(Vector3.up * 3, Vector3.down * 4);//取得射线碰撞的物体。RaycastHit碰撞数据结构体。RaycastHit hit;   //声明一个碰撞数据结构体。 /*检测射线碰撞。out的意思就是,我们把hit传进去,它在内部可以给hit赋值,之后我们就可以把hit拿出来了。*/       bool res = Physics.Raycast(ray, out hit);if (res == true){//鼠标点在地面上。打印碰撞点(只会打印第一个碰撞点)。//Debug.Log("鼠标点在:" + hit.point);}}void Update () {//画出射线Debug.DrawRay(Vector3.up * 3, Vector3.down * 4);}}}

法二:RaycastHit[]碰撞点的集合

  void Start () {//射线。射线的起始点,射线向量。从003的点向下4米的射线。Ray ray = new Ray(Vector3.up * 3, Vector3.down * 4);//取得射线碰撞的物体。RaycastHit碰撞数据结构体。RaycastHit hit;   //声明一个碰撞数据结构体。//法二:检测射线碰撞RaycastHit[] hits = Physics.RaycastAll(ray);}void Update () {//画出射线Debug.DrawRay(Vector3.up * 3, Vector3.down * 4);}}}

鼠标点在地面上

    void Update () {if(Input.GetMouseButtonDown(0)){//取得射线。Camera.main主摄像机。屏幕坐标的位置Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//取得射线碰撞的物体。RaycastHit碰撞数据结构体。RaycastHit hit;   //声明一个碰撞数据结构体。/*检测射线碰撞。意思就是,我们把hit传进去,它在内部可以给hit赋值,之后我们就可以把hit拿出来了。*/bool res = Physics.Raycast(ray, out hit);if (res == true){//鼠标点在地面上。打印碰撞点(只会打印第一个碰撞点)。Debug.Log("鼠标点在:" + hit.point);}}}

物体向鼠标点击的位置移动

 public class ReyTest : MonoBehaviour {//目标点tragetprivate Vector3 target;void Start () {//首先,目标点位置就是自身位置target = transform.position;   }// Update is called once per framevoid Update () {if(Input.GetMouseButtonDown(0)){//取得射线。Camera.main主摄像机。屏幕坐标的位置Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//取得射线碰撞的物体。RaycastHit碰撞数据结构体。RaycastHit hit;   //声明一个碰撞数据结构体。/*检测射线碰撞。out的意思就是,我们把hit传进去,它在内部可以给hit赋值,之后我们就可以把hit拿出来了。*/bool res = Physics.Raycast(ray, out hit, 500f,1<<LayerMask.NameToLayer("Ground"));if (res == true){//鼠标点在地面上。打印碰撞点(只会打印第一个碰撞点)。//Debug.Log("鼠标点在:" + hit.point);//之后,将鼠标点击的位置赋值给目标点target = hit.point;//如果希望Y轴不变,则等于它自身的Y值target.y = transform.position.y;}//判断一下目标位置和我的位置之间的距离,如果大于0.3就向目标距离前进if(Vector3.Distance(target,transform.position)> 0.3f){//得到向量。(目标位置-我的位置),然后转换成单位向量,这样便于计算速度。Vector3 dir = (target - transform.position).normalized;//转向这个向量。Quaternion四元数transform.rotation = Quaternion.LookRotation(dir);//前进transform.Translate(Vector3.forward * 2 * Time.deltaTime);}}}
}

特别说明

法一:(ray, out hit)两个参数(会出现墙后位置不能到达的问题)

            //法一:(ray, out hit)两个参数。会出现墙后位置不能到达的问题。
//检测射线碰撞。out的意思就是,我们把hit传进去,它在内部可以给hit赋值,之后我们就可以把hit拿出来了。bool res = Physics.Raycast(ray, out hit);

法二:四个参数(指定与哪一层进行检测,解决墙后位置不能到达的问题)

参数3:射线长度是500米。参数4:第几层(层Ground在第8层)。
第四个参数:
1、左移运算符<<
2、导致两种写法:比如此处都是要检测地面。
3、第四个参数还影响着:如果不想和谁检测。
即将第四个参数用小括号括起来,前面加波浪线。例如:~(1<<8)

写法一:1<<8 查看地面是哪一层,把层数写在这里,此处为8.
            /*左移运算符<<。LayerMask:1<<层数,就代表和这层进行射线检测。如果是两层,则加|隔开,例如:1<<8 | 1<<9*///法一:1<<8   查看地面是哪一层,把层数写在这里,此处为8. bool res = Physics.Raycast(ray, out hit, 500f,1<<8);
写法二:1<<LayerMask.NameToLayer(“Ground”) 直接写要检测的物体的名字,此处为地面
    //法二:1<<LayerMask.NameToLayer("Ground") 直接写要检测的物体的名字,此处为地面bool res = Physics.Raycast(ray, out hit, 500f,1<<LayerMask.NameToLayer("Ground"));

笔记14 灯光、预设体、3d物体的事件、碰撞体、刚体、炸箱子、触发器、物理材质、射线相关推荐

  1. unity 根据模型生成碰撞体_快速准确立体碰撞体自动生成器Unity游戏素材资源

    本游戏资料是快速准确立体碰撞体自动生成器Unity游戏素材资源,大小:5 MB ,格式:unitypackage,使用软件:unity5.6.4或更高,资产版本:Version 1.1(current ...

  2. Unity 3D 碰撞体(Collider)|| Unity 3D 触发器(Trigger)

    在游戏制作过程中,游戏对象要根据游戏的需要进行物理属性的交互. 因此,Unity 3D 的物理组件为游戏开发者提供了碰撞体组件.碰撞体是物理组件的一类,它与刚体一起促使碰撞发生. 碰撞体是简单形状,如 ...

  3. cocos 射线检测 3D物体 (Sprite3D点击)

    看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个poi ...

  4. unity 根据模型生成碰撞体_Unity之碰撞体组件

    3D物理组件中碰撞体组件添加与设置 碰撞体是物理组件中的一类,3D物理组件和2D物理组件有独特的碰撞体组件,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对象有碰撞体时 ...

  5. Unity3D基础12:碰撞体

    前文:https://blog.csdn.net/Jaihk662/article/details/86757037(Rigidbody物理类组件) 一.碰撞体组件 碰撞体(Collider)可以理解 ...

  6. Unity物理系统中碰撞体、刚体、isKinematic、isTrigger的关系(附动画演示)

    Unity物理系统中碰撞体.刚体.isKinematic.isTrigger的关系 写在前面 产生碰撞的条件 产生触发的条件 实验一:蓝块(碰撞体).红块(碰撞体) 实验二:蓝块(碰撞体).红块(碰撞 ...

  7. unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新

    刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受 ...

  8. Unity 碰撞体 composite

    unity中盒型碰撞体与多边形碰撞体有used by composite这一选项,如果勾选这一选项代表该碰撞体可以被之后添加的composite 复合碰撞体使用,复合碰撞体会将该碰撞体的box与pol ...

  9. 【Unity】11.3 基本碰撞体(箱体、球形、胶囊、网格)

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 碰撞组件(Collider) 是另一种必须随刚体 (Rigidbody) 添加的组件,以便允许它和其他组件发生碰撞.或者 ...

最新文章

  1. PHPStorm+XDebug进行调试
  2. Service Mesh 最火项目 Istio 分层架构,你真的了解吗?
  3. mugen4g补丁如何使用_如何搜索下载游戏
  4. 阿里数据:2020七大数据技术领域趋势展望
  5. python-模块安装方法
  6. 多态方法调用的解析和分派
  7. 跨考计算机教研室,跨考教研室专家:脱离题海沉浮 做到有效做题_跨考网
  8. (转)Spring Boot 2 (八):Spring Boot 集成 Memcached
  9. 爬取某类网站并生成csv文件(人民邮电出版社书籍信息)
  10. 计算机文件夹添加密码,电脑如何给文件夹设置密码
  11. [转]Java实现的求解经典罗马数字和阿拉伯数字相互转换问题示例
  12. html闪屏代码,JS闪屏代码,闪瞎你的眼睛
  13. 如何用ABBYY FineReader提取图片中的文字
  14. 第一次作业——肖祥英
  15. 03 Jme3和Nifty1.4.2中文显示
  16. wpf TextBox日志文本框
  17. STM32F407IGT6与STM32F407ZGT6区别
  18. ai的预览模式切换_ai预览缩略图插件 在资源管理器中预览ai文件和eps文件
  19. Android RecyclerView 横屏禁用滚动/竖屏开启滚动
  20. 自己修改官方rec,使其可以刷第三方包

热门文章

  1. JS - 在html页面实现打印功能
  2. 西门子WINCC日常问题记录
  3. 黑人弹幕用计算机来唱,苏轼唱rap、乾隆玩弹幕…网友:都让开,我要给mc刷火箭!...
  4. 计算机科班出身的优势
  5. 华为ax3pro鸿蒙,一场不公平较量,华为AX3Pro路由器评测,穿墙比赛小米路由器蔫了...
  6. golang中的随机数rand
  7. SurfaceView实现抽奖转盘
  8. 创新模式存争议、资质审核不负责,BOSS直聘IPO道阻且长?
  9. 【一些实用的学习与资源网站,白(学)嫖(习)使人快乐】
  10. Unity 使用RVO2(orca)算法