141 lines
3.8 KiB
C#
141 lines
3.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
// 表示一定需要这个控件
|
|
[RequireComponent(typeof(CharacterController))]
|
|
public class Move : MonoBehaviour
|
|
{
|
|
// 获取摄像机对象的位置信息,[SerializeField] 类似于 java 的构造方法的方法参数
|
|
[SerializeField] private Transform target;
|
|
// 跳起来的速度
|
|
public float jumpSpeed = 15.0f;
|
|
// 重力
|
|
public float gravity = -9.8f;
|
|
// 最终垂直速度
|
|
public float endsVelocity = -10.0f;
|
|
// 在地面时的垂直速度
|
|
public float minFall = -1.5f;
|
|
// 跑起来的速度
|
|
public float runSpeed = 10;
|
|
// 走路的速度
|
|
public float walkSpeed = 4;
|
|
// 垂直速度
|
|
private float verSpeed;
|
|
|
|
// 移动的速度
|
|
public float moveSpeed;
|
|
// 用于存储当前的角色控件
|
|
private CharacterController character;
|
|
|
|
public bool isMove;
|
|
public int curNum;
|
|
|
|
public string currentPosName;//当前位置
|
|
public int currentFloor;//当前楼层
|
|
|
|
public static Move instance;
|
|
|
|
private void Awake()
|
|
{
|
|
instance = this;
|
|
}
|
|
// 在被加载时执行
|
|
void Start()
|
|
{
|
|
// 初始化
|
|
character = GetComponent<CharacterController>();
|
|
verSpeed = minFall;
|
|
moveSpeed = walkSpeed;
|
|
}
|
|
// 每更新一帧时执行
|
|
void Update()
|
|
{
|
|
// 用于存储移动信息
|
|
Vector3 movement = Vector3.zero;
|
|
// 获取左右方向的移动信息
|
|
float horspeed = 0;
|
|
// 获取前后方向的移动信息
|
|
float verspeed = 0;
|
|
if (isMove)
|
|
{
|
|
switch (curNum) {
|
|
case 87:
|
|
verspeed += 0.1f;
|
|
break;
|
|
case 83:
|
|
verspeed -= 0.1f;
|
|
break;
|
|
case 65:
|
|
horspeed -= 0.1f;
|
|
break;
|
|
case 68:
|
|
horspeed += 0.1f;
|
|
break;
|
|
}
|
|
|
|
}
|
|
else {
|
|
horspeed = Input.GetAxis("Horizontal");
|
|
verspeed = Input.GetAxis("Vertical");
|
|
}
|
|
|
|
// 当发生了移动才执行
|
|
if (horspeed != 0 || verspeed != 0|| isMove)
|
|
{
|
|
// 设置左右位置
|
|
movement.x = horspeed * moveSpeed;
|
|
// 设置前后的位置
|
|
movement.z = verspeed * moveSpeed;
|
|
// 设置斜着走的最大速度更水平垂直走的速度一样
|
|
movement = Vector3.ClampMagnitude(movement, moveSpeed);
|
|
// 将移动的信息转化为以摄像机为全局坐标的位置,即保证你向前走一定是摄像机的视角方向
|
|
movement = target.TransformDirection(movement);
|
|
|
|
}
|
|
// 当按下左 shift 是跟换速度
|
|
if (Input.GetKey(KeyCode.LeftShift))
|
|
{
|
|
moveSpeed = runSpeed;
|
|
}
|
|
else
|
|
{
|
|
moveSpeed = walkSpeed;
|
|
}
|
|
// 角色控件自带的一个方法,用于检测是否在地面
|
|
if (character.isGrounded)
|
|
{
|
|
// 按了空格键则给垂直方向施加一个速度
|
|
if (Input.GetButtonDown("Jump"))
|
|
{
|
|
verSpeed = jumpSpeed;
|
|
}
|
|
else
|
|
{
|
|
verSpeed = minFall;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 若已经跳起来了则将垂直方向的速度递减降低,来达到一个 下上下 的一个效果
|
|
// Time.deltaTime 表示为每秒的刷新频率的倒数,用来控制每台电脑的移动速度都是一样的
|
|
verSpeed += gravity * 3 * Time.deltaTime;
|
|
// 限制最大坠落速度
|
|
if (verSpeed < endsVelocity)
|
|
{
|
|
verSpeed = endsVelocity;
|
|
}
|
|
}
|
|
// 给移动一个垂直速度
|
|
movement.y = verSpeed;
|
|
// 控制速度
|
|
movement *= Time.deltaTime;
|
|
// 角色控件自带的一个方法,若用 transform.Translate() 的话会无视碰撞器
|
|
character.Move(movement);
|
|
}
|
|
|
|
public void SetCamera(int num,bool state) {
|
|
curNum = num;
|
|
isMove = state;
|
|
}
|
|
} |