- 👨💻个人主页:@元宇宙-秩沅
- 👨💻 秩沅 原创
👨💻 专栏交流 | 🧧 |
---|---|
🟥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
⭐相关文章:控制游戏人物移动的细节到底有多少?
⭐相关文章:坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!