RPG黑暗之光03

角色控制

创建第三个场景

复制character creatio场景并改名为play为 第三场景
在这里插入图片描述

删除play场景中不需要 的东西
在这里插入图片描述
在这里插入图片描述

创建一个标签管理器Tags

代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tags : MonoBehaviour {
    public const string ground = "Ground";//const标明这是一个共有的不可变的变量
    public const string player = "Player";
}

实现人物行走的点击效果

在人物预设物上添加代码PlayerDir,代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerDir : MonoBehaviour {

    // Use this for initialization
    public GameObject effect_click_prefab;
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(0))//检测鼠标左键按下
        {
            Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            bool isCollider = Physics.Raycast(ray, out hitInfo);
            if (isCollider && hitInfo.collider.tag == Tags.ground)//碰撞到了判断是否碰撞到地面

            {
                ShowClickEffect(hitInfo.point);
            }
        }
       
    }
    //实例化出来点击的效果
    void ShowClickEffect(Vector3 hitPoint)
    {
        hitPoint = new Vector3(hitPoint.x,hitPoint.y+0.5f,hitPoint.z);
        GameObject.Instantiate(effect_click_prefab,hitPoint,Quaternion.identity);
    }
}

将点击动画的预制体拖入人物预制体中
在这里插入图片描述

控制主角移动动画播放

将所有移动的动画都拖入人物预制体中

在这里插入图片描述
修改代码PlayMove如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public enum PlayerState
{
    Moving,
    Idle
}
public class PlayerMove : MonoBehaviour {
    public float speed =5;//定义一个速度

    public PlayerState state = PlayerState.Idle;
    private PlayerDir dir;
    private CharacterController controller;
        

	void Start () {
        dir = this.GetComponent < PlayerDir > ();//获取目标位置
        controller = this.GetComponent<CharacterController>();

    }
	
	// Update is called once per frame
	void Update () {
        float distance = Vector3.Distance(dir.targetPosition, transform.position);
        if (distance > 0.1f)
        {
            state = PlayerState.Moving;
            controller.SimpleMove(transform.forward * speed);
        }
        else
        {
            state = PlayerState.Idle;
        }
	}
}

在人物预设物上添加PlayerAnimation脚本来实现人物行走动画的播放,代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerAnimation : MonoBehaviour {

    private PlayerMove move;

	void Start () {
        move = this.GetComponent<PlayerMove>();
	}
	
	
	
    void LateUpdate()
    {
       if (move.state == PlayerState.Moving)
        {
            PlayAnim("Run");
        }else if(move.state == PlayerState.Idle) {
            PlayAnim("Idle");

        }
        
    }
    void PlayAnim(string animName) {//定义播放动画
        GetComponent<Animation>().CrossFade(animName);
    }
}

控制人物相机跟随

在相机Main Camera上添加脚本FollowPlayer,源码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowPlayer : MonoBehaviour {
    private Transform player;
    private Vector3 offsetPosition;//位置偏移

	// Use this for initialization
	void Start () {
        player = GameObject.FindGameObjectWithTag(Tags.player).transform;
        transform.LookAt(player.position);
        offsetPosition = transform.position - player.position;
	}
	
	// Update is called once per frame
	void Update () {
        transform.position = offsetPosition + player.position;
	}
}

人物模型tags选定player在这里插入图片描述

控制镜头拉伸和鼠标控制旋转

修改代码FollowPlayer,源码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowPlayer : MonoBehaviour {
    private Transform player;
    private Vector3 offsetPosition;//位置偏移
    private bool isRotating = false;
    public float distance = 0;
  public float  scrollSpeed=1;
    public float rotateSpeed = 1;

    // Use this for initialization
    void Start () {
        player = GameObject.FindGameObjectWithTag(Tags.player).transform;
        transform.LookAt(player.position);
        offsetPosition = transform.position - player.position;
	}
	
	// Update is called once per frame
	void Update () {
        transform.position = offsetPosition + player.position;
        // 处理视野拉近拉远效果
        RotateView();
        ScrollView();
      

    }
    void ScrollView()//鼠标滚轮滑动控制视野远近的方法
    {
        print(Input.GetAxis("Mouse ScrollWheel"));//向后滑动 返回负值(拉近),向前滑动返回正值
        distance = offsetPosition.magnitude;
        distance += Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
        distance = Mathf.Clamp(distance, 4, 18);
        offsetPosition = offsetPosition.normalized * distance;
    }
    void RotateView()//鼠标控制镜头旋转的方法
    {
       // Input.GetAxis("Mouse X");//得到鼠标水平方向的滑动
       // Input.GetAxis("Mouse Y");//得到鼠标垂直方向的滑动  
        if(Input.GetMouseButtonDown(1))
        {
            isRotating = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            isRotating = false;
        }
        if (isRotating)
        {
            transform.RotateAround(player.position,player.up,rotateSpeed * Input.GetAxis("Mouse X"));//绕哪个点旋转,绕哪个轴,旋转的度数
            Vector3 originalPos = transform.position;
            Quaternion originalRotation = transform.rotation;

            transform.RotateAround(player.position, transform.right,- rotateSpeed * Input.GetAxis("Mouse Y"));

            float x = transform.eulerAngles.x;//控制上下旋转范围
          if (x < 10 || x > 80)//当超出范围之后将属性归为原来
            {
                transform.position = originalPos;
                transform.rotation = originalRotation;
            }
           
        }
        offsetPosition = transform.position - player.position;//旋转完毕要更新offsetPosition
    }
}

在这里插入图片描述

给角色添加状态信息

在人物预制体上加代码PlayerSatus

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerSatus : MonoBehaviour {
    public int grade = 1;//等级默认为1
    public int hp = 100;//生命值默认100
    public int mp = 100;//魔法值默认100
    public int coin = 200;//金币默认200

}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值