关于Unity中关节的使用(二)
导入
1.创建工程
2.导入joint_scene.unitypackage
3.运行发现机械爪子摇来摇去,因为line节点下面的子节点之间相互碰撞带动的关系
4.为了消除这种乱摇,我们在右上角添加一个catch层,把line节点整个设置成catch层,然后在Edit---->Project Settings---->Physics---->碰撞矩阵里面设置catch层和catch层不碰撞
5.重新运行,机械爪子正常
原理
机械爪子正常之后,发生它上下来回运动,慢慢停下来,但是它的子节点之间又不是弹簧关节,而是固定关节,确实是比较神奇的一个点。
这个神奇的点是这样实现的,首先我们要把几个物体彼此连在一起,要有陷入的那种连接,然后彼此之间的连接都设置为固定关节,把质量调大一点10,最上面那个物体固定坐标,运行,就会有弹簧的效果。
代码解释
Line.position = Line.position + offsetPosition * 1.2f * Time.deltaTime;
速度x时间=距离
距离x方向=坐标偏移量
1.2f是速度
Time.deltaTime是时间
offsetPosition是方向
控制机械爪子的脚本JointControl是挂载在MainCatcher节点下的
JointControl内容是:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems; public class JointControl : MonoBehaviour {
public Transform[] claws0; //爪子一级支节
public Transform[] claws1; //爪子二级支节
public Transform[] claws2; //爪子三级支节 private float angle; //爪子打开或合拢的角度
private float offset; //角度步长 public Transform Line; //绳子对象
private Vector3 offsetPosition; //绳子移动步长 private bool isMove; //绳子移动标志位 void Start () { angle = ; //默认爪子为开启
}
void Update () {
if (angle + offset >= && angle + offset < ) { //爪子可进行操作
for (int i = ; i < ; i++) { //进行开启或合拢
claws0[i].Rotate(Vector3.left, offset * 2.5f, Space.Self); //三级支节分别进行操作
claws1[i].Rotate(Vector3.left, offset * 0.2f, Space.Self);
claws2[i].Rotate(Vector3.left, offset * 1.8f, Space.Self);
}
angle += offset;
}
if (isMove) { //移动绳子
// Line.position = Vector3.Lerp(Line.position, Line.position + offsetPosition * 1.2f, Time.deltaTime * 1.2f);
Line.position = Line.position + offsetPosition * 1.2f * Time.deltaTime;
} this.ctrl_update();
}
public void ControlCatcher(int i) { //开启或合拢爪子监听方法
offset = i == ? -0.2f : 0.2f;
}
public void MoveCatcher(int i) { //移动绳子监听方法
Vector3[] poses = new Vector3[] {Vector3.forward, Vector3.back, Vector3.left, Vector3.right, Vector3.up, Vector3.down};
offsetPosition = poses[i];
isMove = true;
} public void MoveButtonUp() { // 按钮抬起监听方法
isMove = false;
} void ctrl_update() {
if (Input.GetKeyDown(KeyCode.UpArrow)) {
this.MoveCatcher();
}
else if (Input.GetKeyDown(KeyCode.DownArrow))
{
this.MoveCatcher();
}
else if (Input.GetKeyDown(KeyCode.LeftArrow))
{
this.MoveCatcher();
}
else if (Input.GetKeyDown(KeyCode.RightArrow))
{
this.MoveCatcher();
}
else if (Input.GetKeyDown(KeyCode.W)) {
this.MoveCatcher();
}
else if (Input.GetKeyDown(KeyCode.S)) {
this.MoveCatcher();
}
else if (Input.GetKeyUp(KeyCode.UpArrow) || Input.GetKeyUp(KeyCode.DownArrow) ||
Input.GetKeyUp(KeyCode.LeftArrow) || Input.GetKeyUp(KeyCode.RightArrow) ||
Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.S)) {
this.MoveButtonUp();
}
else if (Input.GetKeyDown(KeyCode.Space)) {
this.ControlCatcher();
}
else if (Input.GetKeyDown(KeyCode.P)) {
this.ControlCatcher();
}
}
}
调试小技巧:
想要判断某个节点是不是被脚本控制运行的,可以在运行的过程中关闭脚本,看物体是否正常运动,如果是则和该脚本无关。
关于Unity中关节的使用(二)的更多相关文章
- 关于Unity中关节的使用(一)
1: 刚体的形状大小在物理世界里面是不变的,可是很多时候,我们需要多个刚体来配合使用;2: 关节: 连接刚体与刚体的对应的物理模拟;3: 关节类型: 铰链关节,弹簧关节, 固定关节, 角色关节,可配置 ...
- unity 中 protobuff 的用法 一句话攻略
(一)unity 添加 pb 的 dll 支持.1,从GitHub上下载protobuf源码 (源码链接:https://github.com/google/protobuf),找到 csharp 分 ...
- Unity中创建二维码
在网络上发现了一个可以把字符串转换成二维码的dll,但是我们要怎么使用他呢.不废话,直接进入主题. 用到的引用 using UnityEngine;using ZXing;using ZXing.Qr ...
- 关于Unity中的刚体和碰撞器的相关用法(二)
在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...
- 「翻译」Unity中的AssetBundle详解(二)
为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...
- 【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 (二) : 引入中间层NotificationCenter
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 一对多的观察者模式机制有什么缺点? 想要查看 ...
- Unity中UGUI之Canvas属性解读版本二
Canvas Render Modes(渲染模式) 1.在screen空间中渲染2.在world空间中渲染 Screen Space-Overlay 在这个渲染模式中,UI元素将在场景的上面.如果场景 ...
- Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(下)
http://forum.china.unity3d.com/thread-32273-1-1.html 今天我们继续分享米哈游技术总监贺甲在Unite Beijing 2018大会上的演讲<在 ...
- Unity基础知识学习笔记二
1,object Instantiate(object original,Vector3 position,Quaternion rotation) 克隆原始物体,并返回克隆物体. ...
随机推荐
- HTML5 History API让ajax能回退到上一页
HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL.这个功能很有用,例如通过一段JavaScript代码局部加载页面的内容,你希望通过改变当前页面的 ...
- Bootstrap FileInput中文API整理
这段时间做项目用到bootstrap fileinput插件上传文件,在用的过程中,网上能查到的api都不是很全,所以想着整理一份比较详细的文档,方便自己今后使用,也希望能给大家带来帮助,如有错误,希 ...
- 浅谈hibernate的sessionFactory和session
一.hibernate是什么? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hiber ...
- 每天一个linux命令(6) ar命令
当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量.这里介绍命令ar,用来对库操作. ar命令可以用来创建. ...
- windows 定时任务:schtasks,定时关闭网易云音乐
大部分属于转载和粘贴. 使用命令:schtasks windows 定时任务 使用样例: 每天定时关闭网易云音乐: 每天22:20关闭网易云音乐: schtasks /create /tn &qu ...
- Linux--多网卡的7种Bond模式【转】
转自:http://www.cnblogs.com/lcword/p/5914089.html 网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是一 ...
- 【驱动】input子系统全面分析
初识linux输入子系统 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(InputC ...
- mac下增加eclipse内存
在mac上找不到eclipse.ini文件编辑内存限制,在eclipse安装目录右击eclipse程序,选“显示包内容”,eclipse.ini就在 Content/MacOS下.
- Android.mk简介
http://www.cnblogs.com/hnrainll/archive/2012/12/18/2822711.html Android.mk文件是GNU Makefile的一小部分,它用来对A ...
- JAVA-JSP内置对象之page范围
相关资料:<21天学通Java Web开发> page范围1.当前页有效.2.通过使用pageContext的aetAttribute()设置属性,并通过pageContext的getAt ...