还有半小时就下班了,写一下今天遇到的问题、处理方法以及一些自己的理解。理解的不一定对,还希望大家指正。
今天我做的效果是,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大家可以随意
收拾收拾要下班了,啦啦啦。希望大家多多指教,毕竟我是新手,哈哈。
Unity3D-rigidBody.velocity
时间: 2024-10-10 04:16:22