角色控制器 摇杆的简单移动 小功能方向键控制血条蓝条

角色控制器

有三种方式让角色动起来

(1)transform.position直接修改坐标

(2)刚体 给他一个力 也能动起来

(3)角色控制器 控制角色移动的 Character Controller

 Character Controller 
 Slope Limit 斜坡的限制
 Step Offset 限制台阶的高度
 Skin Width 皮肤宽度(防抖动)
 Min Move Distance 最小移动距离
 Center 中心
 Radius 半径
 Height 高度

摇杆 实现一个简单移动

两个脚本 一个脚本放在摇杆上,另一个放在Player上

using UnityEngine;
using UnityEngine.EventSystems;

public class JoyStick : MonoBehaviour ,
	IBeginDragHandler,IDragHandler,IEndDragHandler
{
	[Header("摇杆移动半径的距离")]
	public float moveRadius = 50;
	
	//记录初始的坐标
	private Vector3 originPos;
	private PlayerController _playerController;

	private void Awake()
	{
		_playerController = GameObject.FindWithTag("Player").GetComponent<PlayerController>();
	}

	private void Start()
	{
		//把当前坐标付过来
		originPos = transform.position;
	}
	
	public void OnBeginDrag(PointerEventData eventData)
	{
		
	}
	
	public void OnDrag(PointerEventData eventData)
	{
		//	【画布的第二种模式需要把屏幕坐标转成世界坐标】
		//临时声明的变量
		Vector3 tempWorldPos = Vector3.one;
		Vector2 tempLocalPos = Vector2.one;
		//找到画布
		//RectTransform canvas = transform.root as RectTransform;
		RectTransform canvas = transform.parent as RectTransform;
		//把屏幕的UI坐标转换成世界的UI坐标
		RectTransformUtility.ScreenPointToWorldPointInRectangle(
			canvas, new Vector2(Input.mousePosition.x, Input.mousePosition.y),
			Camera.main, out tempWorldPos);
		
		RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas,
			new Vector2(Input.mousePosition.x, 
				Input.mousePosition.y), Camera.main, 
			out tempLocalPos);
		
		
		//求中心点到当前拖动到的点距离
		//float dis = Vector3.Distance(originPos, Input.mousePosition);
		float dis = Vector3.Distance(originPos, tempWorldPos);
		Vector3 dir = tempWorldPos - originPos;
		//给玩家赋值方向
		_playerController.dir = new Vector3(dir.x, 0, dir.y);
		//判断 
		if (dis < moveRadius) 
		{
			//拖拽图片运动【画布的第一种模式】
			//transform.position = Input.mousePosition;
			//	【画布的第二种模式需要把屏幕坐标转成世界坐标】
			//赋值位置
			//transform.position = tempWorldPos;
			transform.localPosition = tempLocalPos;
		}
		else
		{
			#region 第一种方式
//			//求他的方向向量 公式:终点-起点
//			Vector3 dir = Input.mousePosition - originPos;
//			//第一种方法
//			//求该向量的单位向量,然后再求目标向量
//			// 当前坐标 = dir的单位向量 * R + 起点
//			//transform.position = dir.normalized * moveRadius + originPos;
//			//第二种方法
//			//Lerp(起点,终点,比例)
//			transform.position = Vector3.Lerp(originPos, Input.mousePosition, moveRadius / dis);
			#endregion

			
			transform.position = Vector3.Lerp(originPos, tempWorldPos, moveRadius / dis);
		}
	}
	
	public void OnEndDrag(PointerEventData eventData)
	{
		//松手的时候,把原来的坐标位置还原
		transform.position = originPos;
		//玩家停下来
		_playerController.dir = Vector3.zero;
	}
}


using System;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
	[HideInInspector]//隐藏监视器面板(不在监视器面板上显示)
	public Vector3 dir;
	[Header("移动速度")]
	public float moveSpeed = 3f;

	private CharacterController _characterController;

	private void Awake()
	{
		_characterController = GetComponent<CharacterController>();
	}

	private void Update()
	{
		if (dir == Vector3.zero)
		{
			return;
		}
		
		//transform.position += dir.normalized * moveSpeed * Time.deltaTime;
		
		//一般不用Move
		//_characterController.Move(dir * Time.deltaTime * moveSpeed);
		_characterController.SimpleMove(dir * Time.deltaTime * moveSpeed);
	}
}

实现一个血条蓝条移动的小功能

头像框是圆的 图片是方形的 如何让图片变成圆的呢?

答:可以把原来的方形图片复制一份(ctrl+d),修改图片(找到一张圆形的白色图片),然后添加Mask组件 ,最后把方形图片拖到圆形图片里 作为他的子对象。

using System;
using UnityEngine;

public class HPMPController : MonoBehaviour
{
	[Header("血条")]
	public RectTransform hpTr;
	[Header("蓝条")]
	public RectTransform mpTr;
    [Header("速度")]
	public float speed = 30f;
    //虚拟轴
    private float hor, ver;
    //最大血量蓝量
    private float maxHP_w, maxMP_w;
    
    private void Start(){
        //把最大的血量蓝量赋过来
        maxHP_w = hpTr.rect.width;
        maxMP_w = mpTr.rect.width;
    }
    
    private void Update(){
        hor = Input.GetAxis("Horizontal");
        ver = Input.GetAxis("Vertical");
        //调宽高
        //血条的
        hpTr.sizeDelta = new Vector2(hpTr.sizeDelta.x + hor * Time.deltaTime * speed, hpTr.sizeDelta.y);
        //蓝条的
        mpTr.sizeDelta = new Vector2(mpTr.sizeDelta.x + ver * Time.deltaTime * speed, mpTr.sizeDelta.y);
        //加一个限制						限制一个值在范围内 Value min max
        heTr.sizeDelta = new Vector2(Mathf.Clamp(heTr.sizeDelta.x, 0, maxHP_w), heTr.sizeDelta.y);
        mpTr.sizeDelta = new Vector2(Mathf.Clamp(mpTr.sizeDelta.x, 0, maxMP_w), mpTr.sizeDelta.y);
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值