Unity3D-rigidBody.velocity

来源:互联网 发布:基础编程书 编辑:程序博客网 时间:2024/05/19 14:54

还有半小时就下班了,写一下今天遇到的问题、处理方法以及一些自己的理解。理解的不一定对,还希望大家指正。

今天我做的效果是,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()函数里:

[csharp] view plaincopy
  1. void Update ()  
  2. {  
  3.     animation.Play ("walk");  
  4.     rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;  
  5. }  
hero移动也有动画

但是如果我写一个触发

[csharp] view plaincopy
  1. void Update ()  
  2. {  
  3.     animation.Play ("walk");  
  4.     //rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;  
  5.     if (Input.GetKey (KeyCode.D)) {  
  6.         rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;  
  7.         //rigidbody.velocity =new Vector3(1,0,0);  
  8.     }  
  9. }  
这样,当我按下D键,hero执行移动就没有效果。

我又修改了一下代码

[csharp] view plaincopy
  1. void Update ()  
  2. {  
  3.     animation.Play ("walk");  
  4.     //rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;  
  5.     if (Input.GetKey (KeyCode.D)) {  
  6.         rigidbody.velocity += transform.forward * heroXSpeed * 1.1f;  
  7.         //rigidbody.velocity =new Vector3(1,0,0);  
  8.     }  
  9. }  

加了一个+号,它就可以了。这样,我就推论出来,Update()是一帧一帧的渲染,可以实时显示效果,但是加入判断之后就需要等待响应,无法做到实时的效果。

还有一种写法是

[csharp] view plaincopy
  1. // Update is called once per frame  
  2. void Update ()  
  3. {  
  4.     animation.Play ("walk");  
  5.     //rigidbody.velocity = transform.forward * heroXSpeed * 1.1f;  
  6.     if (Input.GetKey (KeyCode.D)) {  
  7.         //rigidbody.velocity += transform.forward * heroXSpeed * 1.1f;  
  8.         rigidbody.velocity =new Vector3(1,0,0);  
  9.     }  
  10. }  


这样也可以移动,但是移动较快,和transform.Translate()效果差不多了。

注:heroXSpeed我取的是0.1f大家可以随意

收拾收拾要下班了,啦啦啦。希望大家多多指教,毕竟我是新手,哈哈。


补充:

第二天我补全了代码,调整了思路,就是走一段路之后,hero会停下

[csharp] view plaincopy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Hero_Script : MonoBehaviour  
  5. {  
  6.     //herox轴移动速度  
  7.     public float heroXSpeed=0.1f;  
  8.     //hero是否在移动  
  9.     private bool m_bMoving=false;  
  10.     //hero移动的目的地点  
  11.     private Vector3 m_targetPos;  
  12.     // Use this for initialization  
  13.     void Start ()  
  14.     {  
  15.     }  
  16.       
  17.     // Update is called once per frame  
  18.     void Update ()  
  19.     {  
  20.         Move ();  
  21.         if (m_bMoving) {  
  22.             animation.Play ("walk");  
  23.             rigidbody.velocity = transform.forward * heroXSpeed*1.1f;  
  24.             //Debug.Log(transform.position+" "+m_targetPos);  
  25.             if (Vector3.Distance (transform.position, m_targetPos) < 0.1f) {  
  26.                 //hero的位置与目的地点距离只有0.1时 停止动画 停止移动 进入等待  
  27.                 rigidbody.velocity = Vector3.zero;  
  28.                 m_bMoving = false;  
  29.                 animation.Play ("wait");  
  30.             }  
  31.         }  
  32.   
  33.     }  
  34.     void Move(){  
  35.         if (Input.GetKey (KeyCode.D)) {  
  36.             //记录下目标点  
  37.             m_targetPos =new Vector3(transform.localPosition.x+1,transform.localPosition.y,transform.localPosition.z);  
  38.             transform.LookAt (m_targetPos);  
  39.             //改变移动State  
  40.             m_bMoving = true;  
  41.         }  
  42.     }  
  43. }  


感觉自己学东西好慢啊~~加油!
0 0