注:该组件用于移动位置模拟计算,调用其方法返回一个位置,不会直接作用到游戏物体,可嵌入约束器
查看:MyComponent_Vector3Constraint向量\欧拉角约束器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* 作者:闪电Y黑客
*
* 日期:2019.3.25
*
* 功能:用于计算移动位置的组件
*
* 版本:002
*
*/
/// <summary>
/// 虚拟位置电机
/// </summary>
public class MyComponent_PositionMachine : MonoBehaviour
{
//===[公有]======
/// <summary>
/// 电机激活
/// </summary>
public bool MachineActivation = true;
/// <summary>
/// 电机运行速度(模式不同,速度也不一样)
/// </summary>
public float PositionMoveSpeed = 10; //运动速度
/// <summary>
/// 电机位置约束器
/// </summary>
public MyComponent_Vector3Constraint PositionConstraint;//向量\欧拉角约束器
//===[私有]======
private Vector3 PositionTarget;//目标位置
private Vector3 PositionSave;//电机位置存档
private Vector3 yVelocity;//SmoothDamp返回的当前速度 (暂时无用)
#region 取值
/// <summary>
/// 获取电机位置
/// </summary>
/// <returns>return : 电机位置</returns>
public Vector3 Get_PositionSave()
{
return PositionSave;
}
/// <summary>
/// 判断完成移动
/// </summary>
/// <returns>return : 完成返回true</returns>
public bool If_CompletePosition()
{
return PositionTarget == PositionSave;
}
#endregion
#region 赋值
/// <summary>
/// 位置电机重置
/// </summary>
/// <param name="Position">重置位置</param>
public void Set_Machine_Reset(Vector3 Position)
{
PositionTarget = Position;
PositionSave = PositionTarget;
}
/// <summary>
/// 电机设置:电机激活
/// </summary>
/// <param name="Activation">激活(true\false)</param>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Set_MachineActivation(bool Activation)
{
MachineActivation = Activation;
return this;
}
/// <summary>
/// 电机设置:电机运行速度
/// </summary>
/// <param name="Speed">速度值</param>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Set_MachineMoveSpeed(float Speed)
{
PositionMoveSpeed = Speed;
return this;
}
#endregion
#region 操控
/// <summary>
/// 电机设置:向量操控式(相对于父物体坐标系的轴移动)
/// </summary>
/// <param name="ControlledVector3">操控向量</param>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine SetTarget_Controlled(Vector3 ControlledVector3)
{//控制移动
if (MachineActivation)
{
PositionTarget = PositionSave + ControlledVector3;
}
return this;
}
/// <summary>
/// 电机设置:三轴操控式(相对于父物体坐标系的轴移动)
/// </summary>
/// <param name="x">x轴操控值</param>
/// <param name="y">y轴操控值</param>
/// <param name="z">z轴操控值</param>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine SetTarget_Controlled(float x, float y, float z)
{//控制移动
if (MachineActivation)
{
PositionTarget = PositionSave + new Vector3(x, y, z);
}
return this;
}
/// <summary>
/// 电机设置:目标位置
/// </summary>
/// <param name="TargetPosition">目标位置</param>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine SetTarget_Position(Vector3 TargetPosition)
{//目标向量移动
if (MachineActivation)
{
PositionTarget = TargetPosition;
}
return this;
}
#endregion
#region 电机运行
/// <summary>
/// 电机运行:匀速移动(速度越大越快,需要较大的值)
/// </summary>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Run_MoveTowardsAngle()
{
PositionSave = Vector3.MoveTowards(PositionSave, PositionTarget, PositionMoveSpeed * Time.deltaTime);
return this;
}
/// <summary>
/// 电机运行:差值移动(速度越大越快)
/// </summary>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Run_LerpAngle()
{
PositionSave = Vector3.Lerp(PositionSave, PositionTarget, PositionMoveSpeed * Time.deltaTime);
return this;
}
/// <summary>
/// 电机运行:平滑移动(速度越小越快)
/// </summary>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Run_SmoothDampAngle()
{
PositionSave = Vector3.SmoothDamp(PositionSave, PositionTarget, ref yVelocity, PositionMoveSpeed);
return this;
}
//===[自轴移动]======
/// <summary>
/// 电机运行:自轴移动操控式(相对于自身坐标系的轴移动)
/// </summary>
/// <param name="Origin">物体位置(transform.position)</param>
/// <param name="direction">方向(transform.forward...)</param>
/// <param name="Controlled">操控数(1/-1)操控正反转移动</param>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Run_ShaftControlled(Vector3 Origin, Vector3 direction, float Controlled)
{
if (MachineActivation)
{
PositionSave = Origin + direction * PositionMoveSpeed * Time.deltaTime * Controlled;
}
return this;
}
#endregion
#region 限制器
/// <summary>
/// 以父系坐标轴进行限制移动
/// </summary>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Constraint_Local()
{
if (PositionConstraint != null) PositionSave = PositionConstraint.Constraints_Vector3(PositionSave);//检测限制器,是否进行限制
return this;
}
/// <summary>
/// 以目标位置进行限制范围内移动
/// </summary>
/// <returns>return : 电机组件</returns>
public MyComponent_PositionMachine Constraint_Scope()
{
if (PositionConstraint != null) //检测限制器,是否进行限制
{
Vector3 offsetPosition = PositionSave - PositionTarget;//偏移计算
offsetPosition = PositionConstraint.Constraints_Vector3(offsetPosition);//约束计算
PositionSave = offsetPosition + PositionTarget;//电机存档位置
}
return this;
}
#endregion
}