C# 我如何翻转AI敌人角色的精灵以面对其移动方向?

C# 我如何翻转AI敌人角色的精灵以面对其移动方向?,c#,unity3d,quaternions,image-rotation,C#,Unity3d,Quaternions,Image Rotation,我正在尝试制作一个巡逻AI角色,可以从一个点移动到另一个点 巡逻部分工作得很好。然而,问题是精灵只面向右边。当它转动时,精灵保持朝向同一方向 我尝试使用transform.rotate、transform.rotation、transform.Quaternion更改变换旋转,并创建一个变量来存储旋转值,但它们都会将错误回退。错误通常是由于旋转/旋转函数与我尝试过的任何尝试都不兼容造成的 这是我的密码: using System.Collections; using System.Collect

我正在尝试制作一个巡逻AI角色,可以从一个点移动到另一个点

巡逻部分工作得很好。然而,问题是精灵只面向右边。当它转动时,精灵保持朝向同一方向

我尝试使用
transform.rotate
transform.rotation
transform.Quaternion
更改变换旋转,并创建一个变量来存储旋转值,但它们都会将错误回退。错误通常是由于旋转/旋转函数与我尝试过的任何尝试都不兼容造成的

这是我的密码:

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

/// <summary>
/// To do:
/// - make rotation of enemy sprite work when reaching the end of patrol area
/// - create attack function
/// </summary>


public class Enemy : MonoBehaviour
{
    public int health;
    public float speed;
    public GameObject bloodEffect;
    public Transform[] moveSpots;               //patrol spots
    public float startWaitTime;                 //start countdown till move to next spot

    private Rigidbody2D rb;
    private Animator anim;
    private int randomSpot;                     //number of patrol spots 
    private float waitTime;                     //how long enemy stays at patrol spot for

    // Start is called before the first frame update
    void Start()
    {
        waitTime = startWaitTime; //make waittime equal to startwaittime
        anim = GetComponent<Animator>();
        randomSpot = Random.Range(0, moveSpots.Length); //choose a random first spot 
    }

    // Update is called once per frame
    void Update()
    {

        Vector3 spriteRotation = new Vector3(0, randomSpot, 0);
        transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime); //move toward first patrol area
        transform.eulerAngles = spriteRotation;

        if (Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.5f) //asks if patrol point is further that .5f away from enemy
        {
            if (waitTime <= 0) //if waitTime less than or equal to 0
            {

                randomSpot = Random.Range(0, moveSpots.Length); //picks new patrol point
                waitTime = startWaitTime; //restarts countdown clock
            }
            else
            {
                waitTime -= Time.deltaTime; //counts down clock till next point
            }
        }

        if (health <= 0)
        {
            Destroy(gameObject);
        }
    }


    public void TakeDamage(int damage)
    {
        Instantiate(bloodEffect, transform.position, Quaternion.identity);
        Debug.Log("Blood effect played");
        health -= damage;
        Debug.Log("Damage Taken");
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
/// 
///要做:
///-到达巡逻区末端时,使敌人精灵轮换工作
///-创建攻击功能
/// 
公共阶级敌人:单一行为
{
公共卫生;
公众浮标速度;
公开的游戏对象效果;
公共转换[]移动点;//巡逻点
public float startWaitTime;//开始倒计时,直到移动到下一个地点
私有刚体2d rb;
私人动画师;
private int randomSpot;//巡逻点的数量
私人浮标等待时间;//敌人在巡逻点停留多长时间
//在第一帧更新之前调用Start
void Start()
{
waitTime=startWaitTime;//使waitTime等于startWaitTime
anim=GetComponent

敌人是暗红色立方体,移动点是敌人巡逻的点。当它到达左侧点时,他应该向右转并返回,但这不是发生的情况,他只是来回移动,没有旋转。我尝试了SpriteEnder.flipX路线,它只工作一次,然后坚持使用该路线Action.

随机点
是一个索引而不是一个角度。因此使用

transform.eulerAngles = new Vector3(0, randomSpot, 0);
对我来说没有任何意义


除了旋转,您还可以使用负比例翻转精灵/
图像
,例如:

// Update is called once per frame
private void Update()
{
    // however you determin if facing left or right
    // you e.g. simply check whether the target position 
    // is left or right of you
    var difference = moveSpots[randomSpot].position - transform.position;
    var isFacingRight = difference.x > 0; 

    if (isFacingRight && transform.localScale.x < 0
        || !isFacingRight && transform.localScale.x > 0)
    {
        FlipSprite();
    }
}

private void FlipSprite()
{
    // invert the local X-axis scale
    transform.localScale = new Vector3(-spriteTransform.localScale.x, spriteTransform.localScale.y, spriteTransform.localScale.z);
}
//每帧调用一次更新
私有void更新()
{
//但是,您可以确定是向左还是向右
//例如,您只需检查目标位置
//你在左边还是右边
变量差=moveSpots[randomSpot].position-transform.position;
var isFacingRight=差异.x>0;
if(isFacingRight&&transform.localScale.x<0
||!isFacingRight&&transform.localScale.x>0)
{
FlipSprite();
}
}
私有void FlipSprite()
{
//反转局部X轴比例
transform.localScale=newvector3(-spriteransform.localScale.x,spriteransform.localScale.y,spriteransform.localScale.z);
}

用于示例的脚本

private void Update()
{
    // works only in a ScreenOverlay Canvas
    var targetPosition = Input.mousePosition;

    var difference = targetPosition - transform.position;
    var isFacingRight = difference.x > 0 ? true : false;

    if (isFacingRight && transform.localScale.x < 0
        || !isFacingRight && transform.localScale.x > 0)
    {
        FlipSprite();
    }

    // simply only move left or right on the x-axis towards the mouse
    transform.position = Vector3.MoveTowards(transform.position, new Vector3(targetPosition.x, 218, 0), Time.deltaTime * 100);
}

private void FlipSprite()
{
    // invert the local X-axis scale
    transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
}
private void Update()
{
//仅适用于屏幕覆盖画布
var targetPosition=Input.mousePosition;
var差异=targetPosition-transform.position;
var isFacingRight=差异.x>0?真:假;
if(isFacingRight&&transform.localScale.x<0
||!isFacingRight&&transform.localScale.x>0)
{
FlipSprite();
}
//只需在x轴上向左或向右移动鼠标即可
transform.position=Vector3.movetoward(transform.position,新Vector3(targetPosition.x,218,0),Time.deltaTime*100);
}
私有void FlipSprite()
{
//反转局部X轴比例
transform.localScale=newvector3(-transform.localScale.x,transform.localScale.y,transform.localScale.z);
}

spriteender组件有一个翻转属性,您可以使用该属性

您可以通过代码访问它

SpriteRenderer.flipX = true;
它只会翻转精灵,不会更改任何其他内容,因此请仔细检查碰撞器是否仍在正确的位置:)
祝你好运

无法想象你的意思,需要一张照片^^^^但如果我理解正确,请查找一些faceToScripts或LookAtScripts,这样你的角色将看到你引用他的某个点如果你想翻转精灵,我不会旋转它,而是将其X比例值设置为-1。我记得还有一个翻转属性