using UnityEngine;
using System.Collections;
using System;
/// <summary>
/// 运动控制类
/// </summary>
public class MoveAnimation : MonoBehaviour {
/// <summary>
/// 运动枚举类
/// </summary>
public enum MoveType
{
None,
Yuan,
TuoYuan,
HuanDong,
JianXie,
ZhengCibo,
YuSu,
JiaSu,
MoCaLi,
JiaoJiaSu,
TanXing,
}
public Transform Ball;//运动物体
public Transform Target;//目标物体
public MoveType moveType = MoveType.None;//运动类型,默认不动
public Vector3 center = Vector3.zero; //设置中心点
public float dis = 3f;
//设置x,y,z 旋转角度
private float _px = 0f;
private float _pz = 0f;
private float _py = 0f;
private float Angele = 0f;
//振幅
private float _ratio = 0.05f;
private float _moveSpeed = 0.05f;
private float _a = 0.001f;
private float _ax = 0.001f;
private float _az = 0.001f;
//设置速度
private float _moveSpeedx = 0.05f;
private float _moveSpeedz = 0.01f;
void Update () {
//循环执行,属于哪种状态就执行什么样的运动方式
if (Ball != null && Target != null)
{
if (moveType == MoveType.Yuan)
{
_yuanMove();
_toBounds();
}
if (moveType == MoveType.TuoYuan)
{
_tuoYuanMove();
_toBounds();
}
if (moveType == MoveType.JianXie)
{
_JianXieMove();
_toBounds();
}
if (moveType == MoveType.ZhengCibo)
{
_ZhengCiBoMove();
_toBounds();
}
if (moveType == MoveType.YuSu)
{
_YuSuMove();
_toBounds();
}
if (moveType == MoveType.JiaSu)
{
_JiaSuMove();
_toBounds();
}
if (moveType == MoveType.MoCaLi)
{
_MoCaLiMove();
_toBounds();
}
if (moveType == MoveType.HuanDong)
{
_huanDongMove();
_toBounds();
}
if (moveType == MoveType.TanXing)
{
_tanXinMove();
}
}
}
/// <summary>
/// GUI显示
/// </summary>
void OnGUI()
{
if (GUILayout.Button("圆周运动"))
{
//这里是设置的每种运动状态的初始值
Angele = 0f;
_moveSpeed = .2f;
Ball.localPosition = Vector3.zero;
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.Yuan;
Target.gameObject.SetActive(false);
}
if (GUILayout.Button("椭圆运动"))
{
//这里是设置的每种运动状态的初始值
Angele = 0f;
_moveSpeed = .2f;
Ball.localPosition = Vector3.zero;
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.TuoYuan;
Target.gameObject.SetActive(false);
}
if (GUILayout.Button("简谐振动"))
{
//这里是设置的每种运动状态的初始值
Angele = 0f;
_moveSpeed = .2f;
Ball.localPosition = Vector3.zero;
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.JianXie;
Target.gameObject.SetActive(false);
}
if (GUILayout.Button("正弦余弦运动"))
{
Angele = 0f;
_moveSpeed = .25f;
Ball.localPosition = new Vector3(-18f, 0f, 0f);
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.ZhengCibo;
Target.gameObject.SetActive(false);
}
if (GUILayout.Button("匀速运动"))
{
Angele = 0f;
_moveSpeed = .2f;
Ball.localPosition = new Vector3(-18f, 0f, 0f);
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.YuSu;
Target.gameObject.SetActive(true);
}
if (GUILayout.Button("加速运动"))
{
Angele = 0f;
_moveSpeed = .5f;
_a = 0.001f;
Ball.localPosition = new Vector3(-18f, 0f, 0f);
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.JiaSu;
Target.gameObject.SetActive(true);
}
if (GUILayout.Button("摩擦力"))
{
Angele = 0f;
_moveSpeed = 3f;
Ball.localPosition = new Vector3(-18f, 0f, 0f);
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.MoCaLi;
Target.gameObject.SetActive(false);
}
if (GUILayout.Button("缓动"))
{
Angele = 0f;
_moveSpeed = 2f;
Ball.localPosition = new Vector3(-18f, 0f, 0f);
Target.localPosition = new Vector3(18f, 0f, 0f);
moveType = MoveType.HuanDong;
Target.gameObject.SetActive(true);
}
if (GUILayout.Button("弹性移动"))
{
Angele = 0f;
_moveSpeed = 2f;
Ball.localPosition = new Vector3(-18f, 0f, 0f);
Target.localPosition = Vector3.zero;
moveType = MoveType.TanXing;
Target.gameObject.SetActive(true);
}
}
/// <summary>
/// 圆型移动
/// </summary>
void _yuanMove()
{
Angele += 0.1f;
_px = center.x + dis * (float)Math.Cos(Angele);
_pz = center.z + dis * (float)Math.Sin(Angele);
Ball.localPosition = new Vector3(_px, Ball.localPosition.y, _pz);
}
/// <summary>
/// 椭圆移动
/// </summary>
void _tuoYuanMove()
{
Angele += 0.1f;
_px = center.x + dis * (float)Math.Cos(Angele);
_pz = center.z + dis * 0.5f * (float)Math.Sin(Angele);
_py = 0f;
Ball.localPosition = new Vector3(_px,_py, _pz);
}
/// <summary>
/// 缓动
/// </summary>
void _huanDongMove()
{
float dis = Vector3.Distance(Ball.localPosition, Target.localPosition);
float speed = dis * _ratio;
_px = Ball.localPosition.x + speed;
_py = 0f;
_pz = 0f;
Ball.localPosition = new Vector3(_px, _py, _pz);
}
/// <summary>
/// 简谐振动
/// </summary>
void _JianXieMove()
{
Angele += 0.1f;
// _px = center.x + dis * (float)Math.Cos(_angele);
_pz = center.z + dis * (float)Math.Sin(Angele);
_py = 0f;
_px = 0f;
Ball.localPosition = new Vector3(_px, _py, _pz);
}
/// <summary>
/// 正弦运动 ,Math.Sin()
/// </summary>
void _ZhengCiBoMove()
{
Angele += 0.15f;
_px = Ball.localPosition.x + _moveSpeed;
_pz = center.z + dis * (float)Math.Sin(Angele);
_py = 0f;
Ball.localPosition = new Vector3(_px,_py, _pz);
}
/// <summary>
/// 匀速运动,速度恒定
/// </summary>
void _YuSuMove()
{
float dis = Vector3.Distance(Ball.localPosition, Target.localPosition);
if (dis > 0.5f)
{
_px =Ball.localPosition.x + _moveSpeed;
_py = 0f;
_pz = 0f;
Ball.localPosition = new Vector3(_px, _py, _pz);
}
}
/// <summary>
/// 减速运动,距离越小,速度越慢
/// </summary>
void _JiaSuMove()
{
float dis = Vector3.Distance(Ball.localPosition, Target.localPosition);
if (dis > 0.5f)
{
_moveSpeed += _a;
_px = Ball.localPosition.x + _moveSpeed;
_py = 0f;
_pz = 0f;
Ball.localPosition = new Vector3(_px, _py, _pz);
}
else
{
}
}
/// <summary>
/// 摩擦运动,运动中受摩擦力减速
/// </summary>
void _MoCaLiMove()
{
if (_moveSpeed >= 0.001f)
_moveSpeed *= 0.92f;
else
_moveSpeed = 0f;
_px = Ball.localPosition.x + _moveSpeed;
_py = 0f;
_pz = 0f;
Ball.localPosition = new Vector3(_px, _py, _pz);
}
/// <summary>
/// 弹性移动
/// </summary>
void _tanXinMove()
{
float disx = Target.localPosition.x - Ball.localPosition.x ;
float disz = Target.localPosition.z - Ball.localPosition.z;
_ax = disx * 0.1f;
_az = disz * 0.1f;
_moveSpeedx += _ax;
_moveSpeedz += _az;
_moveSpeedx *= 0.95f;
_moveSpeedz *= 0.95f;
_px = Ball.localPosition.x + _moveSpeedx;
_py =0f;
_pz =Ball.localPosition.z + _moveSpeedz;
Ball.localPosition = new Vector3(_px, _py, _pz);
if (Math.Abs(_moveSpeedx) <= 0.0001f && Math.Abs(_moveSpeedz) <= 0.0001f)
{
Target.localPosition = new Vector3(UnityEngine.Random.Range(-18f, 18f), 0f,UnityEngine.Random.Range(-10f, 10f));
}
}
void _toBounds()
{
if (Ball.localPosition.x > 25f)
{
Ball.localPosition = new Vector3(-25f,Ball.localPosition.y,Ball.localPosition.z);
}
else if (Ball.localPosition.x < -25f)
{
Ball.localPosition = new Vector3(25f, Ball.localPosition.y, Ball.localPosition.z);
}
if (Ball.localPosition.z >15f)
{
Ball.localPosition = new Vector3(Ball.localPosition.x, Ball.localPosition.y,-15f);
}
else if (Ball.localPosition.z <-15f)
{
Ball.localPosition = new Vector3(Ball.localPosition.x, Ball.localPosition.y,15f);
}
}
}