今天研究模型控制器,探寻下怎么实现基本的控制模型方法
首先,我随便拉了几个小模型
这就是猪脚了。先添加常用的前后左右,就是WSAD,按wsad就使角色的transform组件变化下位置,
private float MoveSpeed = 3f; void Start() { } void Update() { if(Input.GetKey(KeyCode.A)) {
//改变角色X轴 transform.Translate(Vector3.right * -MoveSpeed * Time.deltaTime, Space.World); } if(Input.GetKey(KeyCode.D)) { transform.Translate(Vector3.right * MoveSpeed * Time.deltaTime, Space.World ); } if (Input.GetKey(KeyCode.W)) {
//改变角色Y轴 transform.Translate(Vector3.forward * MoveSpeed * Time.deltaTime, Space.World); } if (Input.GetKey(KeyCode.S)) { transform.Translate(Vector3.forward * -MoveSpeed * Time.deltaTime,Space.World); } }
啊,现在那个兽人应该可以前后左右移动了,这里是通过改变角色的transform的position来实现的(其实是废话,都是通过改变这个的,大家懂我的意思就好),
换种思路,我先给个目标点,让角色平移过去
private float MoveSpeed = 6f; void Update() { Vector3 targetPos = transform.position; if(Input.GetKey(KeyCode.A)) { targetPos.Set(targetPos.x-MoveSpeed * Time.deltaTime,targetPos.y,targetPos.z); } if(Input.GetKey(KeyCode.D)) { targetPos.Set(targetPos.x+MoveSpeed * Time.deltaTime,targetPos.y,targetPos.z); } if (Input.GetKey(KeyCode.W)) { targetPos.Set(targetPos.x,targetPos.y,targetPos.z+MoveSpeed * Time.deltaTime); } if (Input.GetKey(KeyCode.S)) { targetPos.Set(targetPos.x,targetPos.y,targetPos.z-MoveSpeed * Time.deltaTime); } transform.position = Vector3.Lerp(transform.position, targetPos, MoveSpeed * Time.deltaTime); }
这是两种移动的方式,暂时只想到两种移动方式,若有其他的回复我。
除了移动方式,方向也是要考虑的,在第一种移动方式中,如何设置角色的朝向呢? 我是这样考虑的,得到移动前的位置和移动后的位置,相减获得方向,啊,我竟聪明如斯,动手
private float MoveSpeed = 3f; void Start() { } void Update() { //获取移动前位置 Vector3 lastPosation = transform.position; if(Input.GetKey(KeyCode.A)) { transform.Translate(Vector3.right * -MoveSpeed * Time.deltaTime); } if(Input.GetKey(KeyCode.D)) { transform.Translate(Vector3.right * MoveSpeed * Time.deltaTime); } if (Input.GetKey(KeyCode.W)) { transform.Translate(Vector3.forward * MoveSpeed * Time.deltaTime); } if (Input.GetKey(KeyCode.S)) { transform.Translate(Vector3.forward * -MoveSpeed * Time.deltaTime); } //设置方向 transform.LookAt(transform.position+ transform.position-lastPosation); }
然后,老鸟该呵呵一笑了
截图看不出效果,如果按照我的代码,这个小人是会原地转圈,看上去很白痴。
........
省略号代表我想了很长时间,然后看了unityAPI
public class example : MonoBehaviour { void Update() { transform.Translate(Vector3.forward * Time.deltaTime); transform.Translate(Vector3.up * Time.deltaTime, Space.World); } }
原来是坐标系的问题,Space.World ,不过我原来一直没考虑这个问题啊,好像也能实现移动?
想了会,原来移动的时候,这兽人脸是不变方向的。所以他移动的时候不考虑方向也行。现在兽人的朝向要变了,自身坐标系就一直在转变,所以要加上世界坐标系
这样这个兽人终于不用走太空步了。
那移动的第二个方法如何做方向,应该只要看向目标点就行了吧,回顾下这个移动的代码,不像自身坐标系,添加
transform.LookAt(targetPos + targetPos-transform.position);
这里的获取awsd的按键事件可以通过unity的API ,Input.GetAxis()来代替
private float MoveSpeed = 3f; void Start() { } void Update() { //获取移动前位置 Vector3 lastPosation = transform.position; float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); transform.Translate(new Vector3(h, 0, v) * MoveSpeed * Time.deltaTime,Space.World); /* if(Input.GetKey(KeyCode.A)) { transform.Translate(Vector3.right * -MoveSpeed * Time.deltaTime, Space.World); } if(Input.GetKey(KeyCode.D)) { transform.Translate(Vector3.right * MoveSpeed * Time.deltaTime, Space.World ); } if (Input.GetKey(KeyCode.W)) { transform.Translate(Vector3.forward * MoveSpeed * Time.deltaTime, Space.World); } if (Input.GetKey(KeyCode.S)) { transform.Translate(Vector3.forward * -MoveSpeed * Time.deltaTime,Space.World); } * */ //设置方向 transform.LookAt(transform.position+ transform.position-lastPosation); }
瞬间感觉清爽了,处女座的福音,而且可以发现角度不像原来的只能45度角变化,移动也平滑了,总之腰不痛,腿不酸,能上六楼了
Input.GetKey()方法通过参数的不同也能获得鼠标与触屏的输入类容,实际上我对这种方法,还有类似的invoke()方法,通过字符串调用其他方法的方式我很有兴趣,以后会去看看这种方法的实现原理与优劣。
常用的pc玩游戏的操作方式还有鼠标,我来看看鼠标点击是怎么移动的,鼠标移动监听他右击时间,这个点是一个三维坐标,但屏幕是2d的,我这想了一会,结合我多年游戏经验,
他么鼠标点的地方最后都是在地面上有木有,所以这里应该是将这个点给弄到地面上,想不明白鼠标点击点是2d的怎么转换为3D呢,首先排除添加默认Y=0 (x,0,z),然后大家请看
虽然有点抽象,但透露着浓浓的后现代艺术气息,A是屏幕,B是虚拟的地面,C是鼠标点,做过C于A面的法线交C面的点应该就是点击在地面上的点了,无论是平行还是交叉的游戏,
法线应该都适用.先看看鼠标右击会得到什么吧。
结果,什么玩意儿都没得到,坑爹。看看API怎么说的
// Performs a mouse look. //执行一个鼠标观察 var horizontalSpeed : float = 2.0; var verticalSpeed : float = 2.0; function Update () { // Get the mouse delta. This is not in the range -1...1 //获取鼠标增量,范围不在-1...1 var h : float = horizontalSpeed * Input.GetAxis ("Mouse X"); var v : float = verticalSpeed * Input.GetAxis ("Mouse Y"); transform.Rotate (v, h, 0); }
javascript才有注释 ,才是亲儿子。 看到注释没,获取鼠标增量。然后我用鼠标划了下屏幕。然后看到参数和模型角度的变化