Unity 中同步移动的实现

本文主要介绍博主最近学习过程中解决的一个问题在unity中, 角色跳到一个移动的物体上时,如何让角色“站在”在移动的物体上,随着物体移动


【问题由来】

博主最近想做一个类似跳方块的游戏,但是在实现过程中,遇到了下面的难题(对于博主来说是一个难题):
Unity 中同步移动的实现_第1张图片

这里大家会发现,当我给小球一个向上的力,使小球跳上一个移动的方块的时候,它并没有跟随着移动的方块一并移动

ps:

图中的小球上面具有刚体碰撞体两个组件。

【尝试】

这里博主试过各种方法,包括调整刚体的各种选项,通过网上查询资料,依然无果。
下面列举博主尝试过两种方法:

  1. 当小球碰到这个移动的方块上时,让这个方块成为小球的父对象,那么小球就会跟着方块移动,离开的时候,解除父对象关系。
  2. 让小球和方块同步移动

【分析】

方法一

方法一理论上可行,但是实现过程中,博主发现小球的的坐标值会随着设置的父对象而出现混乱的情况,简单地说,就是施加父对象以后,小球的坐标值,我们未知,它甚至是悬浮在方块上方的,或者因为坐标值的突然改变,而出现“弹”出视野的情况。
*
此方法不可行

方法二

由于我们这里,想让小球和方块同步移动,那么,我们首先要做的,就是搞清楚,想要同步移动,需要什么条件,通过思考,我们得出下面两个结论

1. 实时方向
2. 实时速度

以上,只要两个物体满足上面的两个条件相等,那么,两个物体放在一起的时候,就可以同步移动

通过实践,方法二,可行,且易于拓展。


ps:介于以上基础,此方法就不适用于用动画系统来控制的方块移动逻辑模式。
我们来看看这里博主写的方块移动逻辑

方块移动类

其中重点博主已经做出注释,其他基础语句博主不足赘述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cube_move : MonoBehaviour
{
    public float R;
    public float L;
    public float minSpeed = 10.0f;
    public float maxSpeed = 10.0f;
    private float Speed;
    private float R_L;
    // Start is called before the first frame update
    void Start()
    {
        R_L = Random.Range(-100, 100);
        Speed = Random.Range(minSpeed, maxSpeed);
        //this.transform.position = new Vector3(0, 0, 0);
    }

    // 以下为方块移动逻辑
    void FixedUpdate()
    {

        if (R_L > 0)
        {
            this.transform.Translate(new Vector3(0.1f, 0, 0) * Speed * Time.deltaTime);

        }
        else
        {
            this.transform.Translate(new Vector3(-0.1f, 0, 0) * Speed * Time.deltaTime);
        }

        if (this.transform.localPosition.x > R)      
        {
            R_L = -1;
        }
        else if (this.transform.localPosition.x < L)
        {
            R_L = 1;
        }
    }
    //重点
    public float GetR_L()                  //划重点,此方法得到此脚本挂载的方块移动“方向”
    {
        return R_L;
    }
    public float GetSpeed()               //划重点,此方法得到此脚本挂载的方块移动“速度”
    {
        return Speed;

    }

角色控制类

其中重点博主已经做出注释,其他基础语句博主不足赘述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player_ctrl : MonoBehaviour
{
    public float thrust=40.0f;
    private Rigidbody rb;
    private Cube_move Cube_moveScripts;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent();
    }

    // Update is called once per frame
    private void FixedUpdate()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(new Vector3(0, 1.0f, 0) * thrust);
        }
        if(Cube_moveScripts==null)     //如果方块没有移动,那么角色也不需要移动
        {
           return;
        }
        else
        {
            if(Cube_moveScripts.GetR_L()>0)                         //重点,让角色和滑块同方向移动
            {
                this.transform.Translate(new Vector3(0.1f, 0, 0) * Cube_moveScripts.GetSpeed()* Time.deltaTime);       //让角色和滑块保持相同速度
            }
             else
            {
             this.transform.Translate(new Vector3(-0.1f, 0, 0) * Cube_moveScripts.GetSpeed() * Time.deltaTime);
             }
        }
    }
    private void OnCollisionStay(Collision other)     //当角色和移动滑块接触的时候,获得滑块上面的移动组件
    {
        Cube_moveScripts = other.gameObject.GetComponent();
    }
    private void OnCollisionExit(Collision other)    //当角色和移动滑块离开的时候,丢弃离开的滑块组件
    {
        Cube_moveScripts = null;
    }

【 回顾】

那么,我们通过上面的代码,我们知道,核心思想就是让角色获得方块的移动逻辑值(速度,方向),以此来让我们的角色知道怎么移动,而且,通过上面的方法,不管方块移动方向是多少,速度是多少,我们的角色都可以跟着同步移动!!!。

好啦,我们这里了解到了核心移动思想,下面来看看效果:

Unity 中同步移动的实现_第2张图片
大功告成!
*

你可能感兴趣的:(解决问题)