MyComponent_PositionMachine虚拟位置电机

注:该组件用于移动位置模拟计算,调用其方法返回一个位置,不会直接作用到游戏物体,可嵌入约束器

查看: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

}

查看:MyComponent_Vector3Constraint向量\欧拉角约束器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值