关于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) 克隆原始物体,并返回克隆物体. ...
随机推荐
- IOS开发----生成静态库(.a)
由于iPhone控件的极度匮乏和自定义组件在重用上的限制,在过去的项目中我们积累了大量的“纯代码”组件——因为IB本身的限制,我们无法把这些组件封装为IB组件库(本来我们想通过分发xib文件的方式重用 ...
- blocking
package blockingtest; /** * Hello world! */public class Sync implements Runnable { int n; public sta ...
- quick3.3final版创建项目报错解决
PHP Notice: Undefined index: QUICK_V3_ROOT in 405,469,497,520,551这5行代码都访问了一个环境变量$_ENV['QUICK_V3_ROO ...
- 【Android】安卓闪电复习
Intent An intent is an abstract description of an operation to be performed 一个Intent就是一次对将要执行的操作的抽象描 ...
- Linux操作系统入门学习总结(2015.10)
用了差不多45天的时间把Linux操作系统入门的资料学习了下.主要阅读了以下几本书: 鸟哥的私房菜:Linux基础学习篇(第三版) "Running Linux" <LINU ...
- C# 实现list=list.OrderBy(q=>q.字段名).ToList(); 按多个字段排序
//倒序 list.OrderByDescending(i => i.a).ThenByDescending(i => i.b); //顺序 list.OrderBy(i => i. ...
- 自定义NSOperation下载图片
自定义NSOperation的话,只是需要将要下载图片的操作下载它的main方法里面,考虑到,图片下载完毕,需要回传到控制器里,这里可以采用block,也可以采用代理的方式实现,我采用的是代理的方式实 ...
- PD003-NET通用后台系统
PD003-NET通用后台系统 开发语言.Net 成品成品 前端技术jquery 数据库sql server .net 通用后台框架 详细信息 基于EF+MVC+Bootstrap构建通用后台管理 ...
- mybatis拦截器实现分页功能的示例讲解
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import jav ...
- [epoll]epoll理解
转自:http://blog.51cto.com/yaocoder/888374 1. 流 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等,可以进行I/O操作的内核对象,不管是文 ...