zoukankan      html  css  js  c++  java
  • 关于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 = 0;          //默认爪子为开启
        }
        void Update () {
            if (angle + offset >= 0 && angle + offset < 20) {                   //爪子可进行操作
                for (int i = 0; i < 4; 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 == 1 ? -0.2f : 0.2f;
        }
        public void MoveCatcher(int i) {        //移动绳子监听方法
            Vector3[] poses = new Vector3[6] {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(4);
            }
            else if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                this.MoveCatcher(5);
            }
            else if (Input.GetKeyDown(KeyCode.LeftArrow))
            {
                this.MoveCatcher(2);
            }
            else if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                this.MoveCatcher(3);
            }
            else if (Input.GetKeyDown(KeyCode.W)) {
                this.MoveCatcher(0);
            }
            else if (Input.GetKeyDown(KeyCode.S)) {
                this.MoveCatcher(1);
            }
            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(1);
            }
            else if (Input.GetKeyDown(KeyCode.P)) {
                this.ControlCatcher(0);
            }
        }
    }

    调试小技巧:

    想要判断某个节点是不是被脚本控制运行的,可以在运行的过程中关闭脚本,看物体是否正常运动,如果是则和该脚本无关。

  • 相关阅读:
    excel读取表,并将结果保存为键值对的字典列表;
    [置顶] MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka
    ActiveMQ持久化消息的三种方式
    getConstructor、getDeclaredConstructor区别
    JavaEE 保存文件获取绝对路径getResource("")和servletContext.getRealPath("/")
    Java中getResourceAsStream的用法
    Java 输出流中的flush方法
    Java之关闭流
    Java中的字节流、缓冲流
    java原生序列化和Kryo序列化性能比较
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7216122.html
Copyright © 2011-2022 走看看