Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,自上而下2D精灵面对玩家位置_C#_Visual Studio_Unity3d - Fatal编程技术网

C#,自上而下2D精灵面对玩家位置

C#,自上而下2D精灵面对玩家位置,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我试图在unity中创建一个脚本,使2d精灵能够跟随玩家。 到目前为止,我成功地为跟随脚本排序了适当的动画,游戏对象跟随玩家,但我相信我不知道如何修改这个脚本,以便它实际上允许精灵跟随玩家,即使精灵实际上没有运动 我相信这是脚本中需要编辑的重要部分,但我可能弄错了,如果有人能帮助我,我将不胜感激: if (Vector3.Distance(target.position, transform.position) <= ChaseRadius && Vecto

我试图在unity中创建一个脚本,使2d精灵能够跟随玩家。 到目前为止,我成功地为跟随脚本排序了适当的动画,游戏对象跟随玩家,但我相信我不知道如何修改这个脚本,以便它实际上允许精灵跟随玩家,即使精灵实际上没有运动

我相信这是脚本中需要编辑的重要部分,但我可能弄错了,如果有人能帮助我,我将不胜感激:

        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(对撞机比较标记(“播放器”))
{
}
}
}