zoukankan      html  css  js  c++  java
  • Unity3D-rigidBody.velocity

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

    今天我做的效果是,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;
    		}
    	}
    }


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





  • 相关阅读:
    HP Nonstop SQLMX (SPJ) Stored Procedure in Javas Getting Started
    Term of Wall Street
    iOS自带地图纠偏问题
    Android 界面排版的5种方式
    Android底部导航栏
    Android中Intent传值与Bundle传值的区别详解
    Android开发EditText属性
    从点击一个链接到浏览器显示页面,这个过程中发生了什么?
    HTML的常用标签属性及使用时需注意的一些细节
    写一个简单的脚本,并在脚本生成的的文件中添加内容
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7266586.html
Copyright © 2011-2022 走看看