【unity每日一记】—物体移动的方法API的总结(GIF图文详解)


在这里插入图片描述


👨‍💻 专栏交流🧧
🟥Unity100个实战基础✨🎁
🟦 Unity100个精华一记✨🎁
🟩 Unity50个demo案例教程✨🎁
🟨 Unity100个精华细节BUG✨🎁

在这里插入图片描述

在这里插入图片描述



⭐基于unity控制物体移动的方法API-GIF图文详解⭐


👨‍💻0.SmoothDamp先快后慢的移动



👨‍💻1.MoveTowards匀速步频实现两点间的移动


在这里插入图片描述

这里的重点是匀速,实现两点间的移动

void FixedUpdate()
    {
        gameObject.transform .position =Vector3.MoveTowards(car.transform.position ,storn.transform.position,0.5f);
    }

👨‍💻2.Lerp()差值实现镜头跟随移动


  • 利用线性差值进行镜头的慢迁移

请添加图片描述

 void LateUpdate()
    {
   transform.position = Vector3.Lerp(transform.position, cube.position, Time.deltaTime);
  }

👨‍💻3,实时更新位置的差值进行镜头的同步移动


其实最简单的方法就直接把相机作为组件挂载上去即可

  • 纯碎位置的实时更新:

请添加图片描述

 void LateUpdate()
    {
        offset = cube.position - transform.position;
        transform.position +=offset;
           
    }
  • 使用Translate的实时更新–TransLate是物体朝某一个方向的移动
    这时不适合于镜头的移动,只适合物体的移动,也就是说适合放在FixedUpdate里面,不适合放在LateUpdate里面,原因如下
    请添加图片描述

此时的镜头的抖动效果并不是地形的原因,而是每帧时位置累加的原因
但是放在FixedUpdate里面就不会出现该情况

所以实现镜头的同步跟随纯粹的位置实时即可,或者直接将相机组件作为移动物体的子组件,保持固定位置


👨‍💻4.监听键盘进行实时位置更新


在这里插入图片描述

也就是键盘进行wsad移动

 void FixedUpdate()
    {
        
        a = gameObject.transform.position.x+Input.GetAxis("Horizontal");
        b = gameObject.transform.position.y;
        c = gameObject.transform.position.z + Input.GetAxis("Vertical"); 
        //此时z轴一直是固定值,c作为y轴的参数后,移动距离只能在[-1,1]之间变化
        move = new Vector3(a,b,c);
        gameObject.transform.position = move ;
    }

妙用:监控键盘的移动—悬浮移动,上下有摆动


  void FixedUpdate()
    {
        
        a = transform.position.x+Input.GetAxis("Horizontal");
        c = transform.position.z + Input.GetAxis("Vertical"); 
        //此时z轴一直是固定值,c作为y轴的参数后,移动距离只能在[-1,1]之间变化
        move = new Vector3(a,c,b);
        transform.position = move ;
    }

在这里插入图片描述

重点在于z轴在固定区域进行上下移动,原因为c的参数是固定的因为z轴未作变化,所以y轴一直都是在不变的z轴位置上进行键盘监听,而范围刚好是是[-1,1]


👨‍💻5.translate与实时监听相配套


在这里插入图片描述


    private void Update()
    {
        //坦克的移动 = 大小*方向
        transform.Translate(Input.GetAxis("Vertical") *Vector3.forward*moveSpeed *Time.deltaTime );
        //坦克的旋转 = 大小*轴向
        transform.Rotate(Input.GetAxis("Horizontal") *Vector3.up *RotateSpeed *Time .deltaTime );
        //头部炮管的旋转 = 大小*轴向
        Head.transform.Rotate(Input.GetAxis ("Mouse X") *Vector3.up*HeadSpeed*Time .deltaTime );
        //左键发射炮弹
        if(Input.GetMouseButtonDown(0))
        {
            Fire();
        }
    }

    public override void Fire() 
    {
        throw new System.NotImplementedException();
    }
}


👨‍💻6.刚体力进行牵引移动


前提是牵引力要大于物体的质量

 void Update()
    {
        cc.AddForce(0 ,0 ,10f);
    }

请添加图片描述


👨‍💻7.刚体力的瞬移


将物体瞬间移动到指定位置的坐标,所以前提得获取指定位置得坐标

在这里插入图片描述

 private void FixedUpdate()
    {
     xx.MovePosition(Vector2 (1,0) );
    }

👨‍💻8.通过控制Rigibody的速度来进行移动控制


[SerializeField] private float moveSpeed_X;
[SerializeField] private float moveSpeed_Y;
private Rigidbody2D rigidbody2D;
private void Start()
{
    //获取挂载脚本的物体的刚体组件
    rigidbody2D = GetComponent<Rigidbody2D>();
}
private void Update()
{
    //水平方向
    float horizontal = Input.GetAxis("Horizontal");
    //竖直方向
    float vertical = Input.GetAxis("Vertical");
    rigidbody2D.velocity=new Vector2 (horizontal*moveSpeed_X*Time.deltaTime, vertical* moveSpeed_Y * Time.deltaTime);
    //也可以只改变x或y的值
    rigidbody2D.velocity = new Vector2(horizontal * moveSpeed_X * Time.deltaTime, rigidbody2D.velocity.y);
    rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, vertical * moveSpeed_Y * Time.deltaTime);
}


👨‍💻9.通过控制Rigibody的MovePosition来进行移动控制


    private float vertical;
    private float horizontal;

    private Rigidbody rigidbody;  //玩家的刚体组件
    private Vector3 moveDerictor; //移动的方向
    public  float  velocity = 1f;     //移动的速度

    private void Awake()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        vertical   =  Input.GetAxis("Vertical") ;
        horizontal =  Input.GetAxis("Horizontal") ;

        if(Input.GetAxis("Vertical")!= 0 || Input.GetAxis("Horizontal")!= 0)
        {
            moveDerictor = new Vector3(horizontal, 0, vertical);
            moveDerictor = moveDerictor.normalized;   //将方向变成单位向量
            rigidbody.MovePosition( transform .position + moveDerictor * velocity * Time.deltaTime); //速度*方向 = 向量
        }
    }


⭐相关文章: 线性差值函数以及平滑阻尼的运用和实践(Lerp AND SmoothDamp)

⭐相关文章:基础不牢,地动山摇系列 ------ 软硬通吃 unity常用API

⭐相关文章:关于游戏剧情模式中用到的基础简单API

⭐相关文章:控制游戏人物移动的细节到底有多少?

⭐相关文章:坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
Unity是一款非常著名的游戏开发引擎,其中一个常见的功能就是控制人物朝向某个方向移动。在Unity中,实现这个功能非常简单。 首先,我们需要创建一个3D游戏场景,并且向场景中添加一个人物模型。接下来,我们需要编写代码来控制人物的移动。 在Unity中,我们可以使用C#脚本来实现人物的控制。首先,在人物模型的脚本中,我们可以定义一个公共变量来存储人物的前方向向量。 ``` public Vector3 forwardDirection; ``` 然后,在人物模型的Update()函数中,我们可以根据键盘输入来更新人物的移动。 ``` void Update() { // 获取键盘的输入 float moveX = Input.GetAxis("Horizontal"); float moveZ = Input.GetAxis("Vertical"); // 根据输入计算人物的移动向量 Vector3 moveDirection = new Vector3(moveX, 0, moveZ); // 控制人物移动的方向 transform.Translate(moveDirection.normalized * Time.deltaTime); // 控制人物朝向 if(moveDirection.magnitude > 0.1f) { forwardDirection = moveDirection; transform.rotation = Quaternion.LookRotation(forwardDirection); } } ``` 在这段代码中,我们首先获取键盘的输入,并根据输入计算人物的移动向量。然后,我们使用Transform.Translate函数将人物移动到新的位置上。最后,我们根据移动向量的长度来控制人物的朝向,正常情况下人物的朝向应该与移动的方向一致。 通过这样的代码,我们就可以实现Unity中人物往面朝的方向移动的功能了。当玩家按下相应的方向键时,人物就会根据键盘输入朝指定的方向移动,并且面向移动的方向。这样可以让玩家更加直观地操作人物在游戏世界中移动
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秩沅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值