笔记14 灯光、预设体、3d物体的事件、碰撞体、刚体、炸箱子、触发器、物理材质、射线
笔记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物体的事件、碰撞体、刚体、炸箱子、触发器、物理材质、射线相关推荐
- unity 根据模型生成碰撞体_快速准确立体碰撞体自动生成器Unity游戏素材资源
本游戏资料是快速准确立体碰撞体自动生成器Unity游戏素材资源,大小:5 MB ,格式:unitypackage,使用软件:unity5.6.4或更高,资产版本:Version 1.1(current ...
- Unity 3D 碰撞体(Collider)|| Unity 3D 触发器(Trigger)
在游戏制作过程中,游戏对象要根据游戏的需要进行物理属性的交互. 因此,Unity 3D 的物理组件为游戏开发者提供了碰撞体组件.碰撞体是物理组件的一类,它与刚体一起促使碰撞发生. 碰撞体是简单形状,如 ...
- cocos 射线检测 3D物体 (Sprite3D点击)
看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个poi ...
- unity 根据模型生成碰撞体_Unity之碰撞体组件
3D物理组件中碰撞体组件添加与设置 碰撞体是物理组件中的一类,3D物理组件和2D物理组件有独特的碰撞体组件,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对象有碰撞体时 ...
- Unity3D基础12:碰撞体
前文:https://blog.csdn.net/Jaihk662/article/details/86757037(Rigidbody物理类组件) 一.碰撞体组件 碰撞体(Collider)可以理解 ...
- Unity物理系统中碰撞体、刚体、isKinematic、isTrigger的关系(附动画演示)
Unity物理系统中碰撞体.刚体.isKinematic.isTrigger的关系 写在前面 产生碰撞的条件 产生触发的条件 实验一:蓝块(碰撞体).红块(碰撞体) 实验二:蓝块(碰撞体).红块(碰撞 ...
- unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新
刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受 ...
- Unity 碰撞体 composite
unity中盒型碰撞体与多边形碰撞体有used by composite这一选项,如果勾选这一选项代表该碰撞体可以被之后添加的composite 复合碰撞体使用,复合碰撞体会将该碰撞体的box与pol ...
- 【Unity】11.3 基本碰撞体(箱体、球形、胶囊、网格)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 碰撞组件(Collider) 是另一种必须随刚体 (Rigidbody) 添加的组件,以便允许它和其他组件发生碰撞.或者 ...
最新文章
- PHPStorm+XDebug进行调试
- Service Mesh 最火项目 Istio 分层架构,你真的了解吗?
- mugen4g补丁如何使用_如何搜索下载游戏
- 阿里数据:2020七大数据技术领域趋势展望
- python-模块安装方法
- 多态方法调用的解析和分派
- 跨考计算机教研室,跨考教研室专家:脱离题海沉浮 做到有效做题_跨考网
- (转)Spring Boot 2 (八):Spring Boot 集成 Memcached
- 爬取某类网站并生成csv文件(人民邮电出版社书籍信息)
- 计算机文件夹添加密码,电脑如何给文件夹设置密码
- [转]Java实现的求解经典罗马数字和阿拉伯数字相互转换问题示例
- html闪屏代码,JS闪屏代码,闪瞎你的眼睛
- 如何用ABBYY FineReader提取图片中的文字
- 第一次作业——肖祥英
- 03 Jme3和Nifty1.4.2中文显示
- wpf TextBox日志文本框
- STM32F407IGT6与STM32F407ZGT6区别
- ai的预览模式切换_ai预览缩略图插件 在资源管理器中预览ai文件和eps文件
- Android RecyclerView 横屏禁用滚动/竖屏开启滚动
- 自己修改官方rec,使其可以刷第三方包
热门文章
- JS - 在html页面实现打印功能
- 西门子WINCC日常问题记录
- 黑人弹幕用计算机来唱,苏轼唱rap、乾隆玩弹幕…网友:都让开,我要给mc刷火箭!...
- 计算机科班出身的优势
- 华为ax3pro鸿蒙,一场不公平较量,华为AX3Pro路由器评测,穿墙比赛小米路由器蔫了...
- golang中的随机数rand
- SurfaceView实现抽奖转盘
- 创新模式存争议、资质审核不负责,BOSS直聘IPO道阻且长?
- 【一些实用的学习与资源网站,白(学)嫖(习)使人快乐】
- Unity 使用RVO2(orca)算法