前言:
1.转动视角
参考教程:《unity 的Cinemachine组件运用》
- 搜索了一下,发现原来
cinemachine 插件可创建freeLook 虚拟相机,这个相机可以直接实现转动视角的效果。 - 可调参数有很多,下面列举一些我
明白意思且 认为重要的。
Follow :跟随对象。Lens - 视野 :默认的很小,几乎大头贴,第一人称了,需要拉远一点。X/Y Axis - 值 :上下高度,可以设置默认值。运行时会变动。X/Y Axis - Speed :转动的速度,相当于跟随的灵敏度。X/Y Axis - Input Axis Name :输入的变量,默认是鼠标的移动,还可以设置成方向键。X/Y Axis - Input Axis Value - Invenrt :这个是反向的勾选,默认的可能反向,方向不对可以修改调整。
2.键盘移动
参考代码:《Unity 键盘WASD 实现物体移动》
-
A:原本我是想着模仿2D入门教程里的做法,赋值速度的。但是发现角色对象没有刚体这个组件(突然好奇是怎么立在地图上的),没有速度的属性…… -
B:后来我想到,既然本来就自带了导航组件,或许应该顺着使用导航来实现键盘移动。只需要每次按键就导航一小段距离就好了。 -
A: 直接使用读取按键输入,然后叠加在坐标上,就可以实现移动了。但因为坐标系的问题,我按W向前,并不是向前,而是朝正X轴方向轴……这就相当于只能轴8个方向了。真正要实现的应该是我视角朝哪边,就往哪边前进。 -
B:运用简单的数学知识——三角函数和反三角函数。我可以根据虚拟相机和角色的坐标,计算出二者相当于绝对坐标系的夹角,然后再输出。代码实现后就是如下效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class MouseManager : MonoBehaviour
{
public float moveSpeed;
public Transform playerTransform, camTransform;
void Update()
{
KeyboardToMove();
}
public void KeyboardToMove()
{
float xPosition = playerTransform.position.x;
float zPosition = playerTransform.position.z;
float ad_input = Input.GetAxisRaw("Horizontal");
float ws_input = Input.GetAxisRaw("Vertical");
if(ad_input != 0 || ws_input != 0)
{
double alpha = (playerTransform.position.x - camTransform.position.x);
alpha /= (playerTransform.position.z - camTransform.position.z);
alpha = Math.Atan(alpha);
if((playerTransform.position.z - camTransform.position.z) < 0)
{
ad_input = -ad_input;
ws_input = -ws_input;
}
xPosition += ws_input * Time.deltaTime * moveSpeed * (float)Math.Sin(alpha);
zPosition += ws_input * Time.deltaTime * moveSpeed * (float)Math.Cos(alpha);
xPosition += ad_input * Time.deltaTime * moveSpeed * (float)Math.Sin(alpha + Math.PI / 2);
zPosition += ad_input * Time.deltaTime * moveSpeed * (float)Math.Cos(alpha + Math.PI / 2);
Vector3 v3 = new Vector3(xPosition, playerTransform.position.y, zPosition);
OnMouseClicked?.Invoke(v3);
}
}
}
一开始测试sin 和cos 时弄得自己头昏目眩,因为懒得细节的每一个方向都推导出来,好麻烦。我就一个一个试,反正就2种情况。太不严谨了,所以导致了一个错误。
-
A:一开始是先只有前后键输入,测试是否成功。一开始还好,但发现时不时就会方向混乱。 -
B:根据之前写ros坐标系的经验,我推断是坐标的正负问题。然后反复测试观察(懒得动笔算数学),发现当朝向面向Z轴负半轴时,WS键的功能会交互。W是后退,S是前进。所以就加了一个判断,但z轴差为负时就取相反数。 -
A:然后添加左右键输入的功能,测试发现更加混乱了。 -
B:稍微推导了一下,当夹角为零时,左右前进就相当于夹角为90°的前后前进。所以加了PI/2 。同时左右也有刚刚的问题,所以当面向Z负半轴就取相反数。
3.完成
|