项目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.

相关推荐
Rauser Mack1 天前
Vibe coding游戏实战:零代码编程五子棋小游戏
人工智能·python·游戏·html·prompt
想做后端的前端2 天前
游戏里的水面是怎么做的
游戏
leoZ2312 天前
Claude 全面解析:从基础原理到实战应用指南
人工智能·游戏
2501_943782352 天前
【共创季稿事节】猜数字游戏:二分法思维与交互式反馈
前端·游戏·microsoft·harmonyos·鸿蒙·鸿蒙系统
星空露珠2 天前
迷你世界UGc3.0脚本Wiki[剧情动画模块管理接口 Timeline]
开发语言·数据结构·算法·游戏·lua
yangmu32032 天前
《星露谷物语》MOD配置与实战安装综合指南
游戏·游戏引擎·游戏程序
xcLeigh2 天前
Unity基础:Game视图详解——游戏预览、分辨率模拟与性能显示
游戏·unity·游戏引擎·音频·视频·game·play模式
yyuuuzz2 天前
2026独立站运营的几个技术细节问题
运维·服务器·网络·人工智能·游戏
Johnstons3 天前
游戏网络测试怎么做?从延迟到丢包,一套完整的游戏弱网测试方案
网络·游戏·php
2023自学中3 天前
imx6ull 开发板, mame 模拟器,运行游戏 测试
linux·游戏·嵌入式·开发板