项目02《游戏-04-开发》Unity3D

基于 项目02《游戏-03-开发》Unity3D ,

因前三集资源以及代码冗余问题,本次项目对前三集进行了重做,资源及代码如下,

首先导入场景及人物资源,

为人物添加动画控制器Animator组件,

创建动画控制器文件夹ACs,并在ACs文件夹下创建Animation Controller命名为PlayerAC角色动画控制器,

0层动画控制器:

1层动画控制器:

2层动画控制器:

创建好角色动画控制器后,将PlayerAC绑定在场景中Player的Animator上,

接下来添加新输入系统,

角色移动(包括跳跃,镜头旋转)

角色攻击(包括连击)

绑定MainGame.cs

双击MainGame.cs修改脚本:

using UnityEngine;

public class MainGame : MonoBehaviour{

public static Player player;

void Awake(){

player = GameObject.Find("Player").GetComponent<Player>();

}

}

绑定摄像机跟随代码:

双击CameraCtrl.cs修改脚本:

using UnityEngine;

public class CameraCtrl : MonoBehaviour{

public float dis;

public float height;

public float speed;

Transform target;

Vector3 targetPos;

void Start(){

target = MainGame.player.transform;

}

void Update(){

transform.LookAt(target.position + Vector3.up * 1.5f);

targetPos = target.forward * (-dis) + target.up * height + target.position;

}

void LateUpdate(){

transform.position = Vector3.Lerp(transform.position, targetPos, speed);

}

}

保存代码后回到unity场景设置数值:

创建角色基类Living.cs:

双击Living.cs脚本,

using UnityEngine;

public class Living : MonoBehaviour{

public Animator Anim { get; set; }

protected virtual void InitValue() {

Anim = GetComponent<Animator>();

}

protected void Start(){

InitValue();

}

}

创建角色类Player.cs:

双击Player.cs修改脚本:

using UnityEngine;

using UnityEngine.InputSystem;

public class Player : Living{

float speed = 3;

float rotate;

bool isHoldRotate;//保持旋转角度

void Start(){

base.Start();

SetInput();

contro = GetComponent<CharacterController>();

}

CharacterController contro;

Controls action;

void SetInput(){

action = new Controls();

action.Enable();

action.PlayerCtrl.Move.started += Move;

action.PlayerCtrl.Move.performed += Move;

action.PlayerCtrl.Move.canceled += StopMove;

action.PlayerCtrl.Jump.started += Jump;

action.PlayerCtrl.Rotate.started += Rotate;

action.PlayerCtrl.Rotate.performed += Rotate;

action.PlayerCtrl.HoldRotate.performed += HoldRotate;

action.PlayerCtrl.HoldRotate.canceled += HoldRotate;

action.PlayerAtt.SwordOut.started += SwordOut;

action.PlayerAtt.Att.started += Attack;

}

void Attack(InputAction.CallbackContext obj){

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight")){

Anim.SetInteger("AttackID", 1);

Anim.SetTrigger("AttackTrigger");

}

else{

int num = Anim.GetInteger("AttackID");

if (num == 6)

return;

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Attack_" + num))

Anim.SetInteger("AttackID", num + 1);

}

}

void SwordOut(InputAction.CallbackContext obj){

Anim.SetBool("IsSwordOut", !Anim.GetBool("IsSwordOut"));

}

void HoldRotate(InputAction.CallbackContext obj){

if (obj.phase == InputActionPhase.Canceled)

isHoldRotate = false;

else

isHoldRotate = true;

}

void Rotate(InputAction.CallbackContext obj){

rotate = obj.ReadValue<float>();

}

void Jump(InputAction.CallbackContext obj){

Anim.SetTrigger("JumpTrigger");

}

void StopMove(InputAction.CallbackContext obj){

Anim.SetBool("IsRun", false);

}

void Move(InputAction.CallbackContext obj){

Anim.SetBool("IsRun", true);

}

void Ctrl(){

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Sprint") ||

Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") ||

Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_ver_A") ||

Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight")){

float f = action.PlayerCtrl.Move.ReadValue<float>();

contro.Move(transform.forward * f * Time.deltaTime * speed);

contro.Move(transform.up * -9.8f * Time.deltaTime);

if (isHoldRotate)

transform.Rotate(transform.up * rotate * 0.3f);

}

}

void Update(){

Ctrl();

}

}

回到Unity中查看绑定在Player角色身上的脚本Player.cs

添加角色控制器组件,Character Controller

运行项目W/S键执行前后移动,右键控制前进方向,

空闲状态:

战斗状态:按E

鼠标左键连击,

鼠标左键一次,

鼠标左键两次,

鼠标左键三次,

鼠标左键四次,

鼠标左键五次,

战斗状态移动,W/S + 鼠标右键控制视角,

按E,解除战斗状态,

非战斗状态移动,

跳跃,空格键

战斗状态空格键是前滚,

测试完成,

End.

相关推荐
早日退休!!!13 分钟前
语言图式论与语言游戏说
游戏
子春一1 小时前
Flutter for OpenHarmony:构建一个 Flutter 井字棋游戏,深入解析状态驱动逻辑、胜利判定与极简交互设计
flutter·游戏·交互
ujainu1 小时前
Flutter + OpenHarmony 游戏开发进阶:CustomPainter 手绘游戏世界——从球体到轨道
flutter·游戏·信息可视化·openharmony
子春一2 小时前
Flutter for OpenHarmony:构建一个 Flutter 贪吃蛇游戏,深入解析状态机、碰撞检测与响应式游戏循环
flutter·游戏
ujainu3 小时前
无物理引擎实现吸附轨道逻辑 —— Flutter + OpenHarmony 实战指南
flutter·游戏·openharmony
ujainu4 小时前
Flutter + OpenHarmony 游戏开发进阶:动态关卡生成——随机圆环布局算法
算法·flutter·游戏·openharmony
听麟4 小时前
HarmonyOS 6.0+ PC端多人联机游戏开发实战:Game Service Kit深度集成与跨设备性能优化
游戏·华为·性能优化·架构·harmonyos·ai-native
reddingtons5 小时前
Cascadeur:动态总是“飘”?“物理外挂流” 3分钟直出重力感 2D 立绘
游戏·设计模式·aigc·设计师·游戏策划·游戏美术·cascadeur
ujainu5 小时前
Flutter + OpenHarmony 游戏开发进阶:游戏主循环——AnimationController 实现 60fps 稳定帧率
flutter·游戏·openharmony
中二病码农不会遇见C++学姐6 小时前
《文明6》Mod开发实战:从游戏日志定位和解决Mod加载问题
数据库·游戏·oracle