Episode 01
Player Control——玩家控制器
Player
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(PlayerController))]
public class Player : MonoBehaviour
{
public float moveSpeed = 5;
Camera viewCamera;
PlayerController controller;
void Start()
{
controller = GetComponent<PlayerController>();
viewCamera = Camera.main;
}
void Update()
{
//实现Player移动
Vector3 moveInput = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
Vector3 moveVelocity = moveInput.normalized * moveSpeed;
controller.Move(moveVelocity);
//实现Player朝向鼠标位置
Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
float rayDistance;
if (groundPlane.Raycast(ray, out rayDistance))
{
Vector3 point = ray.GetPoint(rayDistance);
//Debug.DrawLine(ray.origin, point, Color.red);
//Debug.DrawRay(ray.origin,ray.direction * 100,Color.red);
controller.LookAt(point);
}
}
}
input.GetAxis()与input.GetAxisRaw()两个函数的传入值都为string类型,返回值都为float类型,传入参数有两种:
Vertical:获得垂直方向的值
Horizontal:获得水平方向的值
input.GetAxis()的返回值是[-1, 1],拥有平滑过渡功能
input.GetAxisRaw()的返回值是{-1,0,1}
PlayerController
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour
{
Vector3 velocity;
Rigidbody myRigidbody;
void Start()
{
myRigidbody = GetComponent<Rigidbody>();
}
public void Move(Vector3 _velocity)
{
velocity = _velocity;
}
public void LookAt(Vector3 lookPoint)
{
//保持水平角度转向
Vector3 heightCorrectedPoint = new Vector3(lookPoint.x, transform.position.y, lookPoint.z);
transform.LookAt(heightCorrectedPoint);
}
public void FixedUpdate()
{
//移动位置
myRigidbody.MovePosition(myRigidbody.position + velocity * Time.fixedDeltaTime);
}
}
transform.LookAt():Rotates the transform so the forward vector points at /target/'s current position.
拓展: