C#,自上而下2D精灵面对玩家位置
我试图在unity中创建一个脚本,使2d精灵能够跟随玩家。 到目前为止,我成功地为跟随脚本排序了适当的动画,游戏对象跟随玩家,但我相信我不知道如何修改这个脚本,以便它实际上允许精灵跟随玩家,即使精灵实际上没有运动 我相信这是脚本中需要编辑的重要部分,但我可能弄错了,如果有人能帮助我,我将不胜感激:C#,自上而下2D精灵面对玩家位置,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我试图在unity中创建一个脚本,使2d精灵能够跟随玩家。 到目前为止,我成功地为跟随脚本排序了适当的动画,游戏对象跟随玩家,但我相信我不知道如何修改这个脚本,以便它实际上允许精灵跟随玩家,即使精灵实际上没有运动 我相信这是脚本中需要编辑的重要部分,但我可能弄错了,如果有人能帮助我,我将不胜感激: if (Vector3.Distance(target.position, transform.position) <= ChaseRadius && Vecto
if (Vector3.Distance(target.position, transform.position) <= ChaseRadius && Vector3.Distance(target.position, transform.position) > MinimumChaseRadius)
{
Vector3 temp = Vector3.MoveTowards(transform.position, target.position, MoveSpeed * 0);
changeAnim(temp - transform.position);
}
private void SetAnimFloat(Vector2 setVector2)
{
if (ChasePlayer)
{
Animator.SetFloat("MoveX", setVector2.x);
Animator.SetFloat("MoveY", setVector2.y);
}
else
{
Animator.SetFloat("LastMovedX", setVector2.x);
Animator.SetFloat("LastMovedY", setVector2.y);
}
}
private void changeAnim(Vector2 direction)
{
if (Mathf.Abs(direction.x) > Mathf.Abs(direction.y))
{
if (direction.x > 0)
{
SetAnimFloat(Vector2.right);
} else if (direction.x < 0)
{
SetAnimFloat(Vector2.left);
}
}else if (Mathf.Abs(direction.x) < Mathf.Abs(direction.y))
{
if (direction.y > 0)
{
SetAnimFloat(Vector2.up);
}
else if (direction.y < 0)
{
SetAnimFloat(Vector2.down);
}
}
}
if(矢量3.距离(目标位置、变换位置)最小半径)
{
Vector3 temp=Vector3.MoveToward(transform.position,target.position,MoveSpeed*0);
changeAnim(温度-变换位置);
}
私有void SetAnimFloat(Vector2 setVector2)
{
如果(追击球员)
{
SetFloat(“MoveX”,setVector2.x);
SetFloat(“MoveY”,setVector2.y);
}
其他的
{
SetFloat(“LastMovedX”,setVector2.x);
SetFloat(“LastMovedY”,setVector2.y);
}
}
私有void changeAnim(矢量2方向)
{
如果(数学绝对值(方向x)>数学绝对值(方向y))
{
如果(方向x>0)
{
SetAnimFloat(向量2.右);
}否则如果(方向x<0)
{
SetAnimFloat(向量2.左);
}
}否则如果(数学绝对值(方向x)<数学绝对值(方向y))
{
如果(y方向>0)
{
SetAnimFloat(Vector2.up);
}
否则如果(方向y<0)
{
SetAnimFloat(矢量2.向下);
}
}
}
下面是完整代码的完整版本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AIFollow : MonoBehaviour
{
private Transform target;
public float ChaseRadius;
[SerializeField] private bool ChasePlayer;
public float MinimumChaseRadius;
public float MoveSpeed = 0f;
public Transform HomePosition;
[SerializeField]private Animator Animator;
private Rigidbody2D NPCRigidBody;
public static float LastMovedX;
public static float LastMovedY;
Vector3 lastPos;
Vector3 currentPos;
void Start()
{
if (!ChasePlayer)
{
Animator.SetBool("Movement", false);
}
NPCRigidBody = GetComponent<Rigidbody2D>();
target = GameObject.FindWithTag("Player").transform;
}
void FixedUpdate()
{
LastMovedX = Animator.GetFloat("LastMovedX");
LastMovedY = Animator.GetFloat("LastMovedY");
CheckDistance();
}
private void Update()
{
if (Animator.GetFloat("MoveX") >= 1 || Animator.GetFloat("MoveX") <= -1 || Animator.GetFloat("MoveY") >= 1 || Animator.GetFloat("MoveY") <= -1)
{
Animator.SetFloat("LastMovedX", Animator.GetFloat("MoveX"));
Animator.SetFloat("LastMovedY", Animator.GetFloat("MoveY"));
currentPos = transform.position;
}
else
{
lastPos = transform.position;
currentPos = transform.position;
}
if (currentPos.x != lastPos.x)
{
}
else
{
}
}
void CheckDistance()
{
if (ChasePlayer)
{
if (Vector3.Distance(target.position, transform.position) <= ChaseRadius && Vector3.Distance(target.position, transform.position) > MinimumChaseRadius)
{
Animator.SetBool("Movement", true);
Vector3 temp = Vector3.MoveTowards(transform.position, target.position, MoveSpeed * Time.deltaTime);
NPCRigidBody.MovePosition(temp);
changeAnim(temp - transform.position);
}
else
{
Animator.SetBool("Movement", false);
}
}
else
{
if (Vector3.Distance(target.position, transform.position) <= ChaseRadius && Vector3.Distance(target.position, transform.position) > MinimumChaseRadius)
{
Vector3 temp = Vector3.MoveTowards(transform.position, target.position, MoveSpeed * 0);
changeAnim(temp - transform.position);
}
}
}
private void SetAnimFloat(Vector2 setVector2)
{
if (ChasePlayer)
{
Animator.SetFloat("MoveX", setVector2.x);
Animator.SetFloat("MoveY", setVector2.y);
}
else
{
Animator.SetFloat("LastMovedX", setVector2.x);
Animator.SetFloat("LastMovedY", setVector2.y);
}
}
private void changeAnim(Vector2 direction)
{
if (Mathf.Abs(direction.x) > Mathf.Abs(direction.y))
{
if (direction.x > 0)
{
SetAnimFloat(Vector2.right);
} else if (direction.x < 0)
{
SetAnimFloat(Vector2.left);
}
}else if (Mathf.Abs(direction.x) < Mathf.Abs(direction.y))
{
if (direction.y > 0)
{
SetAnimFloat(Vector2.up);
}
else if (direction.y < 0)
{
SetAnimFloat(Vector2.down);
}
}
}
private void OnTriggerEnter2D(Collider2D collider)
{
if (collider.CompareTag("Player"))
{
}
}
private void OnTriggerStay2D(Collider2D collider)
{
}
private void OnTriggerExit2D(Collider2D collider)
{
if (collider.CompareTag("Player"))
{
}
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类:单一行为
{
私有转换目标;
公共交通半径;
[field]私人bool ChasePlayer;
公共浮动最小半径;
公共浮动速度=0f;
公众立场;
[SerializeField]私人动画师;
私人Rigidbody2D机构;
公共静态浮动LastMovedX;
公共静态浮动;
向量3-lastPos;
矢量3电流位置;
void Start()
{
如果(!ChasePlayer)
{
动画师.SetBool(“运动”,假);
}
NPCRigidBody=GetComponent();
target=GameObject.FindWithTag(“玩家”).transform;
}
void FixedUpdate()
{
LastMovedX=Animator.GetFloat(“LastMovedX”);
LastMovedY=Animator.GetFloat(“LastMovedY”);
检查距离();
}
私有void更新()
{
如果(Animator.GetFloat(“MoveX”)>=1 | Animator.GetFloat(“MoveX”)=1 | Animator.GetFloat(“MoveY”)Mathf.Abs(direction.y))
{
如果(方向x>0)
{
SetAnimFloat(向量2.右);
}否则如果(方向x<0)
{
SetAnimFloat(向量2.左);
}
}否则如果(数学绝对值(方向x)<数学绝对值(方向y))
{
如果(y方向>0)
{
SetAnimFloat(Vector2.up);
}
否则如果(方向y<0)
{
SetAnimFloat(矢量2.向下);
}
}
}
私有void OnTriggerEnter2D(碰撞R2D碰撞器)
{
if(对撞机比较标记(“播放器”))
{
}
}
专用void OnTriggerStay2D(碰撞r2d碰撞器)
{
}
私有无效OnTriggerExit2D(碰撞R2D碰撞器)
{
if(对撞机比较标记(“播放器”))
{
}
}
}