1.这玩意关闭后,有可能导致鼠标指针移动摄像机视角的速度产生变化,比如在编辑器就可以,但打包出来后就视角移动过快或过慢。而只要它开着,就能保持一致。 同一个电脑上运行和打包,所以不存在帧数高低的问题。
下面上代码片段:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class PlayerCamaraManager : ReWriteGameControl_CF
{
static PlayerCamaraManager instance;
public static PlayerCamaraManager Instance
{
get { return instance; }
}
bool playerCanMove = false;
CharacterController characterController;
bool moving = false;
Vector3 lastFrameMousePosition;
Vector3 currentFrameMousePosition;
Vector3 difference;
float pcMoveSpeed = 1.0f;
float phoneMoveSpeed = 1.0f;
GraphicRaycaster _raycaster;
bool canClosePanel=false;
protected override void Awake()
{
base.Awake();
if(instance==null)
{
instance = this;
}
characterController = GetComponent<CharacterController>();
}
void Update()
{
if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer)
{
PlayerMove_PC();
}
else if (Application.platform == RuntimePlatform.Android)
{
PlayerMove_Android();
}
}
private void PlayerMove_PC()
{
if (Input.GetKeyDown(KeyCode.Mouse1))
{
moving = true;
currentFrameMousePosition = Input.mousePosition;
lastFrameMousePosition = currentFrameMousePosition;
if (moving && playerCanMove && !inputManager_CF.IsUI())
{
EventCenter.CallplayerStartMoveEvent();
}
}
if (Input.GetKeyUp(KeyCode.Mouse1))
{
moving = false;
}
if (moving&&playerCanMove && !inputManager_CF.IsUI())
{
//设置当前帧鼠标指针位置
currentFrameMousePosition = Input.mousePosition;
//当前帧与上一帧的差乘上速度值再乘上每帧耗费的时间
difference = (currentFrameMousePosition - lastFrameMousePosition) * pcMoveSpeed * Time.deltaTime ;
Vector3 up = Vector3.forward * -1 * difference.y;
Vector3 right = Vector3.right * -1 * difference.x;
Vector3 destination = up + right;
//player控制器移动特定的距离
characterController.Move(destination);
//设置上一帧鼠标指针位置
lastFrameMousePosition = Input.mousePosition;
}
}
private void PlayerMove_Android()
{
//判断单个手指的左右滑动方向
if (Input.touchCount == 1)
{
if (Input.touches[0].phase == TouchPhase.Began)
{
moving = true;
canClosePanel = true;
currentFrameMousePosition = Input.mousePosition;
lastFrameMousePosition = currentFrameMousePosition;
}
if (Input.touches[0].phase == TouchPhase.Ended)
{
moving = false;
canClosePanel = false;
}
if (Input.touches[0].phase == TouchPhase.Moved&& !inputManager_CF.IsUI())
{
if (moving && playerCanMove)
{
currentFrameMousePosition = Input.mousePosition;
difference = (currentFrameMousePosition - lastFrameMousePosition) * phoneMoveSpeed * Time.deltaTime;
Vector3 up = Vector3.forward * -1 * difference.y;
Vector3 right = Vector3.right * -1 * difference.x;
Vector3 destination = up + right;
characterController.Move(destination);
lastFrameMousePosition = Input.mousePosition;
EventCenter.CallplayerStartMoveEvent();
if (canClosePanel)
{
canClosePanel = false;
}
}
}
}
}
public void PlayerCanMove()
{
playerCanMove = true;
}
public void PlayerCanNotMove()
{
playerCanMove = false;
}