C# 我如何翻转AI敌人角色的精灵以面对其移动方向?
我正在尝试制作一个巡逻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
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。我记得还有一个翻转属性