CangJie/Assets/Scripts//PlayerControl.cs
Roman c20e4ffb17 任务:编写场景1逻辑
1.完善黄帝功能使其
(1.有函数可以提出需求,返回值为一种绳结类型

2.增加一些美术素材

3.搭建场景
(*.引入cinemaMachine
(1.增加cinemaMachine组件,使其跟随玩家
(2.布置地面碰撞盒
(3.放置空气墙
(4.放置三个不同种类的绳结
(5.放置黄帝
(6.粗略制作了一下视差

4.添加图层分层
(1.内含:远景、中景(不遮挡玩家,中景(遮挡玩家、近景、UI

任务:对接主程满足需求

1.给PlayerContoral加了一个切换操作状态的函数,目前有Normal和Null两种状态

我是每天上班提醒小助手,今天你上班了吗?😺
2022-03-15 00:38:35 +08:00

126 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using Sirenix.OdinInspector;
/// <summary>
/// 玩家的控制器部分,玩家主类必须继承这个类才能对控制做出反应
/// </summary>
public class PlayerControl : MonoBehaviour
{
private PlayerC playerC;
/// <summary>
/// 此帧输入方向,-1为左1为右0此帧不输入
/// </summary>
[SerializeField][ReadOnly][Header("此帧输入方向,-1为左1为右0表示此帧不输入")]
protected int inputDir;
protected PlayerInteract playerInteract;
protected virtual void Start()
{
playerC = new PlayerC();
//playerC.Enable();
playerC.Normal.Enable();
//为事件订阅方法
//为移动操作订阅方法
playerC.Normal.Move.performed += ctx => OnMove(ctx);
playerC.Normal.Move.canceled += ctx => { inputDir = 0; };
//为攻击操作订阅方法
playerC.Normal.Atk.performed += ctx => OnAtk();
//为跳跃操作订阅方法
playerC.Normal.Jump.performed += ctx => OnJump();
//为交互操作订阅方法
playerC.Normal.Interact.performed += ctx => OnInteract();
//为左切换操作订阅方法
playerC.Normal.LeftChange.performed += ctx => OnLeftChange();
//为右切换操作订阅方法
playerC.Normal.RightChange.performed += ctx => OnRightChange();
//给玩家物体添加子物体:互动侦察器
GameObject checker = new GameObject("互动侦察器");//新建游戏物体:互动侦察器
checker.transform.SetParent(transform);//将其设置为玩家的子物体
playerInteract = checker.AddComponent<PlayerInteract>();//增加玩家互动侦察器组件
checker.AddComponent<BoxCollider2D>().isTrigger = true;//增加碰撞盒,并将其设置为触发器
checker.GetComponent<BoxCollider2D>().size = new Vector2(1f, 1f);//设置碰撞盒大小
checker.transform.localPosition = Vector3.zero;//设置碰撞盒位置
}
/// <summary>
/// 当有移动输入的时候触发,因为涉及读值重些的时候记得必须Base
/// </summary>
protected virtual void OnMove(InputAction.CallbackContext ctx){
//根据读值设置记录的输入方向
if(ctx.ReadValue<float>() > 0){
inputDir = 1;
}else if(ctx.ReadValue<float>() < 0){
inputDir = -1;
}
if(ctx.ReadValue<float>().Equals(0f)){
inputDir = 0;
}
}
/// <summary>
/// 按下攻击时触发
/// </summary>
protected virtual void OnAtk(){}
/// <summary>
/// 按下跳跃时触发
/// </summary>
protected virtual void OnJump(){}
/// <summary>
/// 按下交互时触发
/// </summary>
protected virtual void OnInteract(){
//如果有交互事件,则调用事件
playerInteract.OnCall();
}
/// <summary>
/// 按下十字键左或者Q触发
/// </summary>
protected virtual void OnLeftChange(){}
/// <summary>
/// 按下十字键右或者E触发
/// </summary>
protected virtual void OnRightChange(){}
/// <summary>
/// 改变玩家的操作地图至参数值
/// </summary>
/// <param name="mapName">要改到的操作地图的名称</param>
public void ToMap(string mapName)
{
//先关闭所有的
CloseAllMaps();
//再打开指定的
switch(mapName)
{
case "Normal":
playerC.Normal.Enable();
break;
case "Null" :
playerC.Null.Enable();
break;
default:
Debug.LogError("没有叫" + mapName + "的操作地图");
break;
}
}
protected void CloseAllMaps()
{
//关闭所有的操作地图
playerC.Normal.Disable();
playerC.Null.Disable();
}
}