角色控制器
有三种方式让角色动起来
(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);
}
}