ARPG游戏开发学习2——进入游戏、主角生成与控制

 

 

 player添加Character Controller组件实现碰撞效果 

 

角色控制代码如下:

InputC

public class InputC : MonoBehaviour
{
    public static InputC instance;
    public Vector2 m_Movement;
    public Vector3 m_Camera;

    //观察者模式
    public event UnityAction<Vector2> InputEventUpdate;

    private void Awake()
    {
        instance = this;
    }

    void Start()
    {
        
    }

    
    void Update()
    {
        m_Movement.Set(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
        m_Camera.Set(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"), Input.GetAxis("Mouse ScrollWheel"));

       if(InputEventUpdate!=null)
        {
            InputEventUpdate(m_Movement);
        }  
    }
}

PlayerC

public class PlayerC : MonoBehaviour
{
    private CharacterController controller;
    public float walkSpeed = 4.5f;

    public static PlayerC instance;
    InputC m_Input;

    //监听事件
    private void OnEnable()
    {
        InputC.instance.InputEventUpdate += FuncUpdate;
    }

    private void OnDisable()
    {
        InputC.instance.InputEventUpdate -= FuncUpdate;
    }

    private void Awake()
    {
        instance = this;
        controller = GetComponent<CharacterController>();
        m_Input = FindObjectOfType<InputC>();
    }

    private void Move()
    {
        //float H = Input.GetAxis("Horizontal");
        //float V = Input.GetAxis("Vertical");
        Vector3 dir = transform.TransformDirection(new Vector3(m_Input.m_Movement.x, -1, m_Input.m_Movement.y));
        controller.Move(dir * walkSpeed * Time.deltaTime);
    }

    void Start()
    {
        
    }

    
    void Update()
    {
       // Move();
    }

   
    void FuncUpdate(Vector2 m_Movement)
    {
        Vector3 dir = transform.TransformDirection(new Vector3(m_Movement.x, -1, m_Movement.y));
        controller.Move(dir * walkSpeed * Time.deltaTime);
    }

    
}

PlayerAni

public class PlayerAni : MonoBehaviour
{
    public Animator ani;
    InputC m_Input;

    void Start()
    {
        m_Input = FindObjectOfType<InputC>();

    }

    
    void Update()
    {
        ani.SetFloat("horizontal", m_Input.m_Movement.x);
        ani.SetFloat("vertical", m_Input.m_Movement.y);
    }
}

 

ARPG摄像机

ARPGcameraC

public class ARPGcameraC : MonoBehaviour
{
    public Transform target;
    public float targetHeight = 1.8f;   //到目标距离的高度
    public float targetSide = -0.1f;    //到目标距离的偏移值(水平方向)
    public float distance = 4;          //距离(拉近拉远)
    public float maxDistance = 8;       //最大距离
    public float minDistance = 2.2f;    //最小距离
    public float xSpeed = 250;          //水平旋转速度
    public float ySpeed = 125;          //垂直旋转速度
    public float yMinLimit = -10;       //旋转上角度
    public float yMaxLimit = 72;        //旋转下角度
    public float zoomRate = 80;         //缩放倍数
    public float x =20;                 
    public float y =0;

    InputC m_Input;

    private void Awake()
    {
        m_Input = FindObjectOfType<InputC>();

        //隐藏鼠标
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }
    void Start()
    {
        
    }

    
    void Update()
    {
        
    }

    private void LateUpdate()
    {
        x += m_Input.m_Camera.x * xSpeed * Time.deltaTime;
        y -= m_Input.m_Camera.y * ySpeed * Time.deltaTime;

        distance -= (m_Input.m_Camera.z * Time.deltaTime) * zoomRate * Mathf.Abs(distance);
        distance = Mathf.Clamp(distance, minDistance, maxDistance);

        y = ClampAngle(y,yMinLimit,yMaxLimit);
        Quaternion rotation = Quaternion.Euler(y, x,0);
        transform.rotation = rotation;

        if (m_Input.m_Camera.x != 0 || m_Input.m_Camera.y != 0)
        {
            target.transform.rotation = Quaternion.Euler(0, x, 0);
        }
        transform.position = target.position - ((rotation * new Vector3(targetSide, 0, 1)*distance - new Vector3(0,targetHeight,0)));
    }


    float ClampAngle(float angle,float min, float max)
    {
        if(angle<-360)
        {
            angle += 360;
        }
        if(angle>360)
        {
            angle -= 360;
        }

        return Mathf.Clamp(angle, min, max);
    }
}

 

效果预览:

 

posted @ 2020-08-24 14:27  青柠是酸的  阅读(266)  评论(0)    收藏  举报