关于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) 克隆原始物体,并返回克隆物体. ...
随机推荐
- sql字段组合唯一
create unique index [Itenmid_Uid] on Userchangeinfo(Itemid,Uid)
- python2和Python3异同总结
1. python3 异常不再接收逗号(,)作为参数: ## python3 中这样可以正常运行 try: print("在这里执行的代码,有异常进入except") except ...
- git(8):常用命令
Git常用操作命令收集: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote -v ...
- 【Java Concurrency】sleep()、wait()、notify()、notifyAll()的用法与区别
>关于本文 本文介绍sleep().wait().notify().notifyAll()方法,主要要理解: sleep()和wait()的区别. wait()与notify().notifyA ...
- Dubbo实践笔记
注意的地方 默认情况下,cluster=failover.retries=2,意为失败重试两次,不包含原生调用.如需配置不重试,需设置retries=-1,或者使用failfast(快速失败)模式 如 ...
- 【Cmd】那些年,我们迷恋的cmd命令(二)
那些年,我们迷恋的命令(一) 那些年,我们迷恋的命令(二) Linux系统下基本命令 Linux系统下基本命令: 要区分大小写 uname 显示版本信息(同win2K的 ver) dir 显示当前目录 ...
- Android下基于SDL的YUV渲染
实战篇 本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染. 相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitm ...
- FIDDLER的使用方法及技巧总结(连载五)FIDDLER的一些故障排除
五.FIDDLER的一些故障排除
- 【转载】一个Sqrt函数引发的血案
转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 源码下载地址:http://diducoder ...
- BAT-局域网内在线电脑IP
相关资料:朋友发来的,来源不明. 问题现象:有个朋友问我都在一个内网中,电脑A没有显示器,怎么找到它的IP. 问题处理: 1.登陆路由器查看IP在线情况. 2.用BAT文件显示出在线IP. 显示局域网 ...