您的位置:首页 > 移动开发 > Unity3D

unity 实现宠物跟随移动

2016-12-29 18:10 591 查看

简单的跟随移动

玩家移动控制脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
float h = Input.GetAxis ("Horizontal");
float v = Input.GetAxis ("Vertical");
if(h!=0 || v!=0){
transform.LookAt (transform.position+new Vector3(h,0,v));
transform.Translate (transform.forward*Time.deltaTime*5f,Space.World);
}

}
}


跟对对象移动控制脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PetMove : MonoBehaviour {
public Transform player;//主角
public float speed=1f;//移动的阻尼,值越小,移动越平缓
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {//如果主角和宠物直接的距离大于5,控制宠物跟随主角移动
if(Vector3.Distance(player.position,transform.position)>5f){
PetSmothFlow ();
//to do。。播放移动动画
}
//to do。。播放站立动画
//控制宠物的朝向
transform.LookAt (player.position);

}
//控制宠物的位置平滑移动
void PetSmothFlow(){
transform.position=Vector3.Lerp (transform.position,player.position,Time.deltaTime*speed);
}
}


宠物跟随移动

玩家移动控制脚本

using UnityEngine;
using System.Collections;

public class PlayerMove : MonoBehaviour {
public float speed = 8f;
Animator anim;
// Use this for initialization
void Start () {
anim = this.GetComponent<Animator>();
}

// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v=Input.GetAxis("Vertical");
if (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0)
{
transform.LookAt(transform.position + new Vector3(h, 0, v));
transform.Translate(transform.forward * Time.deltaTime * speed, Space.World);
anim.SetBool("Run", true);
}
else anim.SetBool("Run",false);

}
}


跟对对象移动控制脚本

using UnityEngine;
using System.Collections;

public class PetFlow : MonoBehaviour {
public Transform player;
public float maxDis = 5;
Animator anim;

private SmoothFollowerObj posFollow;//控制位置平滑移动
private SmoothFollowerObj lookFollow;//控制朝向平滑转换

public Vector3 positionVector;//角色位置移动的时候,方向向量
public Vector3 lookVector;//角色朝向变化的时候,朝向向量

private Vector3 lastVelocityDir;//上一次移动的方向
private Vector3 lastPos;//之前移动的目标点位置

// Use this for initialization
void Start () {
anim = this.GetComponent<Animator>();//获取动画控制器
posFollow = new SmoothFollowerObj(0.5f, 0.5f);
lookFollow = new SmoothFollowerObj(0.1f, 0.0f);
posFollow.Update(transform.position, 0, true);//初始化负值
lookFollow.Update(player.transform.position, 0, true);

positionVector = new Vector3(0, 0.5f, 1.7f);
lookVector = new Vector3(0, 0, 1.5f);

lastVelocityDir = player.transform.forward;
lastPos = player.transform.position;

}

// Update is called once per frame
void Update () {
float dis = Vector3.Distance(transform.position,player.position);
if (dis > maxDis)//如果玩家和宠物之间的距离大于允许的最大距离,控制宠物向玩家移动
{
PetMoveFlow();//宠物移动的逻辑
anim.SetBool("Run", true);
}
else {
anim.SetBool("Run",false);
}

transform.LookAt(player.position,Vector3.up);

}

private void PetMoveFlow()
{
lastVelocityDir += (player.transform.position - lastPos) * 5;
lastPos = player.transform.position;
lastVelocityDir += player.transform.forward * Time.deltaTime;
lastVelocityDir = lastVelocityDir.normalized;
Vector3 horizontal = transform.position - player.transform.position;
Vector3 horizontal2 = horizontal;
Vector3 vertical = player.transform.up;
Vector3.OrthoNormalize(ref vertical, ref horizontal2);
if (horizontal.sqrMagnitude > horizontal2.sqrMagnitude) horizontal = horizontal2;
transform.position = posFollow.Update(
player.transform.position + horizontal * Mathf.Abs(positionVector.z) + vertical * positionVector.y,
Time.deltaTime
);

horizontal = lastVelocityDir;
Vector3 look = lookFollow.Update(player.transform.position + horizontal * lookVector.z - vertical * lookVector.y, Time.deltaTime);
transform.rotation = Quaternion.FromToRotation(transform.forward, look - transform.position) * transform.rotation;
}

class SmoothFollowerObj
{

private Vector3 targetPosition;
private Vector3 position;
private Vector3 velocity;
private float smoothingTime;
private float prediction;

public SmoothFollowerObj(float smoothingTime)
{
targetPosition = Vector3.zero;
position = Vector3.zero;
velocity = Vector3.zero;
this.smoothingTime = smoothingTime;
prediction = 1;
}

public SmoothFollowerObj(float smoothingTime, float prediction)
{
targetPosition = Vector3.zero;
position = Vector3.zero;
velocity = Vector3.zero;
this.smoothingTime = smoothingTime;
this.prediction = prediction;
}

// 更新位置信息
public Vector3 Update(Vector3 targetPositionNew, float deltaTime)
{
Vector3 targetVelocity = (targetPositionNew - targetPosition) / deltaTime;//获取目标移动的方向向量
targetPosition = targetPositionNew;

float d = Mathf.Min(1, deltaTime / smoothingTime);
velocity = velocity * (1 - d) + (targetPosition + targetVelocity * prediction - position) * d;

position += velocity * Time.deltaTime;
return position;
}

//根据传递进来的数据,重置本地参数
public Vector3 Update(Vector3 targetPositionNew, float deltaTime, bool reset)
{
if (reset)
{
targetPosition = targetPositionNew;
position = targetPositionNew;
velocity = Vector3.zero;
return position;
}
return Update(targetPositionNew, deltaTime);
}

public Vector3 GetPosition() { return position; }
public Vector3 GetVelocity() { return velocity; }
}
}


demo 下载:http://download.csdn.net/detail/u011484013/9724831
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 跟随移动