【Unity自制手册】基于Unity中物体移动相关方法和API集锦(动图详解)



👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unity每日一记


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

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

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

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

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


文章目录


⭐基于Unity中物体移动相关方法和API集锦⭐


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



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


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

csharp 复制代码
void FixedUpdate()
    {
        gameObject.transform .position =Vector3.MoveTowards(car.transform.position ,storn.transform.position,0.5f);
    }

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


  • 利用线性差值进行镜头的慢迁移
csharp 复制代码
 void LateUpdate()
    {
   transform.position = Vector3.Lerp(transform.position, cube.position, Time.deltaTime);
  }

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


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

  • 纯碎位置的实时更新:
csharp 复制代码
 void LateUpdate()
    {
        offset = cube.position - transform.position;
        transform.position +=offset;
           
    }
  • 使用Translate的实时更新 --TransLate是物体朝某一个方向的移动
    这时不适合于镜头的移动,只适合物体的移动,也就是说适合放在FixedUpdate里面,不适合放在LateUpdate里面,原因如下

此时的镜头的抖动效果并不是地形的原因,而是每帧时位置累加的原因

但是放在FixedUpdate里面就不会出现该情况

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


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


也就是键盘进行wsad移动

csharp 复制代码
 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 ;
    }

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


csharp 复制代码
  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与实时监听相配套


cpp 复制代码
    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.刚体力进行牵引移动


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

csharp 复制代码
 void Update()
    {
        cc.AddForce(0 ,0 ,10f);
    }


👨‍💻7.刚体力的瞬移


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

csharp 复制代码
 private void FixedUpdate()
    {
     xx.MovePosition(Vector2 (1,0) );
    }

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


csharp 复制代码
[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来进行移动控制


csharp 复制代码
    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

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

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


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

相关推荐
新手unity自用笔记10 分钟前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
心前阳光2 小时前
Unity之XR Interaction Toolkit | IPointerDownHandler问题
unity·游戏引擎·xr
帅_shuai_1 天前
unity 静态字段内存查找工具
unity·游戏引擎
郝学胜-神的一滴1 天前
[简化版 GAMES 104] 现代游戏引擎 06:从Tick时序到邮局模型,拆解确定性世界的底层密码
开发语言·c++·游戏引擎·图形渲染·软件开发·opengl
鹿野素材屋2 天前
Unity超轻量级中文语音播报,仅5兆大小,无需联网即可使用,适用于弹幕、提示等动态语音播出
unity·游戏引擎
电子云与长程纠缠3 天前
UE5 Lyra PocketWorld进行3D内容UI预览 - 上
开发语言·学习·3d·ue5·游戏引擎
玖玥拾3 天前
Unity3D RPG 入门项目(八)游戏设置面板、帧率控制、快捷技能药品栏、技能解锁系统
游戏·3d·unity·游戏引擎
ellis19703 天前
u3d插件xLua[十] lua侧判空问题
unity
牛哇网络工作室4 天前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
ellis19704 天前
u3d插件xLua[九]例8 Hotfix
unity