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

相关推荐
程序猿阿伟7 小时前
《游戏平衡的高阶解法:强化学习主导的参数迭代策略》
游戏
锦瑟弦音7 小时前
跑酷游戏开发笔记3 && 游戏开始场景 cocos 3.8.7
javascript·笔记·游戏
Minecraft红客9 小时前
C++制作迷宫第一版
c++·游戏·电脑·娱乐
CreasyChan9 小时前
3D游戏数学基础指南
游戏·3d·unity·数学基础
神仙别闹1 天前
基于QT(C++)实现的翻金币游戏
c++·qt·游戏
夏鹏今天学习了吗1 天前
【LeetCode热题100(74/100)】跳跃游戏
算法·leetcode·游戏
郝学胜-神的一滴1 天前
使用Qt OpenGL开发俄罗斯方块:从零到一实现经典游戏
c++·qt·程序人生·游戏·设计模式·系统架构·图形渲染
夏鹏今天学习了吗1 天前
【LeetCode热题100(75/100)】跳跃游戏 II
算法·leetcode·游戏
星光一影1 天前
合成植物大战僵尸 安卓原生APP Cocos游戏 支持Sigmob
android·游戏·php·html5·web app
元亓亓亓1 天前
LeetCode热题100--45. 跳跃游戏 II--中等
算法·leetcode·游戏