Unity3D-rigidBody.velocity
2014-08-18 18:09
405 查看
还有半小时就下班了,写一下今天遇到的问题、处理方法以及一些自己的理解。理解的不一定对,还希望大家指正。
今天我做的效果是,hero的移动。
以前做过用的是transform.Translate(Vector3.forward*Time.deltaTime*Speed);
但是这样做有些bug就是移动不持续,当然你也可以加上时间延时函数,一点点的模拟动画效果,太麻烦了(我就想这样干)。
后来,老师指导我加力,rigidbody.AddForce(new Vector3(1,0,0));我这样想太单纯了,这样做的效果就是,hero倒了。
没办法,后来拿到了一段代码
rigidbody.velocity = transform.forward * heroXSpeed*1.1f;
walkDistance -= heroXSpeed * Time.fixedDeltaTime*1.1f;
核心是第一句rigidbody.velocity群中有说是计算刚体速度向量(好官方),有说给物体一个初速度。反正就是这个意思。
不过这段话放在Update()函数里:
但是如果我写一个触发
我又修改了一下代码
加了一个+号,它就可以了。这样,我就推论出来,Update()是一帧一帧的渲染,可以实时显示效果,但是加入判断之后就需要等待响应,无法做到实时的效果。
还有一种写法是
这样也可以移动,但是移动较快,和transform.Translate()效果差不多了。
注:heroXSpeed我取的是0.1f大家可以随意
收拾收拾要下班了,啦啦啦。希望大家多多指教,毕竟我是新手,哈哈。
补充:
第二天我补全了代码,调整了思路,就是走一段路之后,hero会停下
using UnityEngine;
using System.Collections;
public class Hero_Script : MonoBehaviour
{
//herox轴移动速度
public float heroXSpeed=0.1f;
//hero是否在移动
private bool m_bMoving=false;
//hero移动的目的地点
private Vector3 m_targetPos;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
Move ();
if (m_bMoving) {
animation.Play ("walk");
rigidbody.velocity = transform.forward * heroXSpeed*1.1f;
//Debug.Log(transform.position+" "+m_targetPos);
if (Vector3.Distance (transform.position, m_targetPos) < 0.1f) {
//hero的位置与目的地点距离只有0.1时 停止动画 停止移动 进入等待
rigidbody.velocity = Vector3.zero;
m_bMoving = false;
animation.Play ("wait");
}
}
}
void Move(){
if (Input.GetKey (KeyCode.D)) {
//记录下目标点
m_targetPos =new Vector3(transform.localPosition.x+1,transform.localPosition.y,transform.localPosition.z);
transform.LookAt (m_targetPos);
//改变移动State
m_bMoving = true;
}
}
}
感觉自己学东西好慢啊~~加油!
今天我做的效果是,hero的移动。
以前做过用的是transform.Translate(Vector3.forward*Time.deltaTime*Speed);
但是这样做有些bug就是移动不持续,当然你也可以加上时间延时函数,一点点的模拟动画效果,太麻烦了(我就想这样干)。
后来,老师指导我加力,rigidbody.AddForce(new Vector3(1,0,0));我这样想太单纯了,这样做的效果就是,hero倒了。
没办法,后来拿到了一段代码
rigidbody.velocity = transform.forward * heroXSpeed*1.1f;
walkDistance -= heroXSpeed * Time.fixedDeltaTime*1.1f;
核心是第一句rigidbody.velocity群中有说是计算刚体速度向量(好官方),有说给物体一个初速度。反正就是这个意思。
不过这段话放在Update()函数里:
void Update () { animation.Play ("walk"); rigidbody.velocity = transform.forward * heroXSpeed * 1.1f; }hero移动也有动画
但是如果我写一个触发
void Update () { animation.Play ("walk"); //rigidbody.velocity = transform.forward * heroXSpeed * 1.1f; if (Input.GetKey (KeyCode.D)) { rigidbody.velocity = transform.forward * heroXSpeed * 1.1f; //rigidbody.velocity =new Vector3(1,0,0); } }这样,当我按下D键,hero执行移动就没有效果。
我又修改了一下代码
void Update () { animation.Play ("walk"); //rigidbody.velocity = transform.forward * heroXSpeed * 1.1f; if (Input.GetKey (KeyCode.D)) { rigidbody.velocity += transform.forward * heroXSpeed * 1.1f; //rigidbody.velocity =new Vector3(1,0,0); } }
加了一个+号,它就可以了。这样,我就推论出来,Update()是一帧一帧的渲染,可以实时显示效果,但是加入判断之后就需要等待响应,无法做到实时的效果。
还有一种写法是
// Update is called once per frame void Update () { animation.Play ("walk"); //rigidbody.velocity = transform.forward * heroXSpeed * 1.1f; if (Input.GetKey (KeyCode.D)) { //rigidbody.velocity += transform.forward * heroXSpeed * 1.1f; rigidbody.velocity =new Vector3(1,0,0); } }
这样也可以移动,但是移动较快,和transform.Translate()效果差不多了。
注:heroXSpeed我取的是0.1f大家可以随意
收拾收拾要下班了,啦啦啦。希望大家多多指教,毕竟我是新手,哈哈。
补充:
第二天我补全了代码,调整了思路,就是走一段路之后,hero会停下
using UnityEngine;
using System.Collections;
public class Hero_Script : MonoBehaviour
{
//herox轴移动速度
public float heroXSpeed=0.1f;
//hero是否在移动
private bool m_bMoving=false;
//hero移动的目的地点
private Vector3 m_targetPos;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
Move ();
if (m_bMoving) {
animation.Play ("walk");
rigidbody.velocity = transform.forward * heroXSpeed*1.1f;
//Debug.Log(transform.position+" "+m_targetPos);
if (Vector3.Distance (transform.position, m_targetPos) < 0.1f) {
//hero的位置与目的地点距离只有0.1时 停止动画 停止移动 进入等待
rigidbody.velocity = Vector3.zero;
m_bMoving = false;
animation.Play ("wait");
}
}
}
void Move(){
if (Input.GetKey (KeyCode.D)) {
//记录下目标点
m_targetPos =new Vector3(transform.localPosition.x+1,transform.localPosition.y,transform.localPosition.z);
transform.LookAt (m_targetPos);
//改变移动State
m_bMoving = true;
}
}
}
感觉自己学东西好慢啊~~加油!
相关文章推荐
- Unity3D-rigidBody.velocity
- Unity3D-rigidBody.velocity
- Unity3D-rigidBody.velocity
- Unity3D - RigidBody vs Collider
- rigidbody.velocity 控制角色的移动
- unity3D 使用rigidbody.AddForce(movement)
- unity3d 中 transform.position 与Rigidbody.position的同步问题
- An Overview of Rigid Body Velocity
- Unity3d 关于碰撞事件触发,触发器事件触发和 RigidBody以及IsKinematic RigidBody,Collider以及IsTrigger Collider 的条件总结
- unity3D 使用rigidbody.AddForce(movement)
- transform.rotation和GetComponent<Rigidbody>().MoveRotation
- Chipmunk Rigid Bodies:cpBody
- Rigidbody.position/rotation更新测试
- unity3d用欧拉角(eulerAngles)给刚体直接加速度(velocity )的算法举例
- Chipmunk Rigid Bodies:cpBody
- Rigidbody.MovePosition 移动位置
- Rigidbody.AddExplosionForce 添加爆炸力
- unity, Rigidbody.constraints
- Rigidbody OnCollisionEnter OnTriggerEnter的总结(一)
- mesh rigidbody drawing