项目文档链接:John Lemon's Haunted Jaunt 项目教程 (适用于3D初学者) - Unity Learn
1.Unity中建立C#脚本
在Project栏中在Asset中右键后选择create点击C#Script即可
建议创建一个Scripts文件夹用于存放C#脚本
建立时没有修改名称记得后续要重命名一下
脚本PlayerMovement总代码
using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.Collections;
using Unity.VisualScripting;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
Vector3 m_Movement;
Quaternion m_Rotation = Quaternion.identity;
Animator m_Animator;
Rigidbody m_Rigidbody;
AudioSource m_AudioSource;
public float turnSpeed=20f;
void Start()
{
m_Animator = GetComponent<Animator>();
m_Rigidbody = GetComponent<Rigidbody>();
m_AudioSource = GetComponent<AudioSource>();
}
// Update is called once per frame
void FixedUpdate()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
m_Movement.Set(horizontal, 0f, vertical);
m_Movement.Normalize();
bool hasHorizontalInput=!Mathf.Approximately(horizontal, 0f);
bool hasVerticalInput=!Mathf.Approximately(vertical, 0f);
bool isWalking = hasHorizontalInput || hasVerticalInput;
m_Animator.SetBool("IsWalking", isWalking);
if (isWalking)
{
if (!m_AudioSource.isPlaying)
{
m_AudioSource.Play();
}
}
else
{
m_AudioSource.Stop();
}
Vector3 disiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
m_Rotation = Quaternion.LookRotation(disiredForward);
}
private void OnAnimatorMove()
{
m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
m_Rigidbody.MoveRotation(m_Rotation);
}
}
---------------------------------------------------------------------------------------------------------------------------------
Vector3 m_Movement;
Quaternion m_Rotation = Quaternion.identity;
Animator m_Animator;
Rigidbody m_Rigidbody;
AudioSource m_AudioSource;
public float turnSpeed=20f;
void Start()
{
m_Animator = GetComponent<Animator>();
m_Rigidbody = GetComponent<Rigidbody>();
m_AudioSource = GetComponent<AudioSource>();
}
Vector3 是Unity常用类之一 用来表示3D向量,也可以用于欧拉旋转
Quaternion为四元数 由xyz和w四个分量组成,Unity中用于存储表示对象的旋转角度
Animator、Rigibody、AudioSource都是Unity提供的组件
Animator 用于控制Unity中游戏对象(GameObject)的动画状态
Rigibody是Unity中提供控制游戏对象物理状态的组件 ,用户可以通过Rigibody组件来控制游戏对象的速度、旋转和其他物理属性
AudioSource是Unity中用来控制音频的组件,可以在组件中赋予游戏对象音频,同时调节音频音量和其他音频属性
GetComponent()是Unity提供的GameObject类中的方法
可以通过调用GetComponent()直接访问游戏对象的组件和进行参数的调整
Input.GetAxis()是Unity中的一个方法
用于获取玩家在键盘或者游戏手柄上输入的某个轴(即Axis)的值
Input.GetAxis("Horizontal")为获取水平轴
Input.GetAxis("Vertical")为获取垂直轴
在大多数情况下,水平轴被绑定到左右方向键或者左右摇杆,而垂直轴被绑定到上下方向键或者上下摇杆。Unity自动绑定了键盘的WASD以及上下左右
Input.GetAxis("Mouse X")和 Input.GetAxis("Mouse Y")则获取鼠标的滚轮轴的输入,分别对应鼠标的水平和垂直滚轮移动。
m_Movement.Set()即Vector3.Set()是将获取到的水平轴、垂直轴数值赋予给对象的一种方法
(x,y,z)
m_Movement.Normalize()进行向量的归一化,将Vector3中的向量长度缩放为1,并保持方向不变,确保移动速度不收输入值大小影响
关于Normalize()方法的参考文章链接:Unity中的normalized参数_unity normalized-CSDN博客
Mathf.Approximately(x,y)判断X与Y是否接近
Animator.Setbool(X,Y) 第一个参数为要修改的布尔类型 第二个为bool参数
if语句块中是AudioSource类提供的三个方法 Isplaying是播放状态
RotateTowards()会返回一个新的Vector3向量 通过计算旋转速度和时间来旋转移动方向,同时限制最大转角度为0
以保证实现平滑地调整物体朝向
Time.deltaTime是一个表示上一帧到当前帧所用时间的变量,表示每一帧的间隔。后续常用。
MovePosition是一种移动刚体的方法,表示物体下一帧的位置,参数皆可计算
MoveRotation用于表示刚体的旋转,接受Quaternion类型的参数 用于表示物体下一帧的旋转