c# - Moving the character controller to vector 3 position -
i'm making boss ai perform jump attack against player, ai use both navmesh , character controller movment (navmash pathfinding), i'm having hard time trying move ai designated position. here code:
charactercontroller chara; [serializefield] transform playertran; [serializefield] float gravity = 3.8f; [serializefield] float jumpforce = 50f; vector3 movevector = vector3.zero; [serializefield] transform jumpcheck; [serializefield] transform jumppos; // use initialization void start () { chara = getcomponent<charactercontroller>(); playertran = gameobject.findgameobjectwithtag("player").getcomponent<transform>(); } // update called once per frame void update () { chara.move(movevector); if (chara.isgrounded) { transform.lookat(playertran); } movevector -= vector3.up * gravity * time.deltatime; if (input.getkeyup(keycode.j)) { jumpcheck.position = new vector3(playertran.position.x, 0, playertran.position.z); float angle = findangle( playertran.position.x - transform.position.x , playertran.position.z - transform.position.z); vector3 _tojumppos = makejumpcricle(playertran.position , jumpcheck.localscale.x/2, angle); jumppos.position = new vector3(_tojumppos.x, 0, _tojumppos.z); movevector = vector3.up * jumpforce * time.deltatime; } } float findangle(float x, float y) { float value; value = (float)((mathf.atan2(x, y) / mathf.pi) * 180); if (value < 0) { value += 360; } debug.log(value); return value; } vector3 makejumpcricle( vector3 center, float radius, float angle) { vector3 pos = vector3.zero; pos.x = center.x - radius * mathf.sin(angle * mathf.deg2rad); pos.y = 0; pos.z = center.z - radius * mathf.cos(angle * mathf.deg2rad); return pos; } i want move ai jumppos both forward , vectors i'm not sure this.
code visualization found solution, used bezier curves generate path
posting here other might find helpful.
refrence link http://www.theappguruz.com/blog/bezier-curve-in-games
public linerenderer jumpline; private int numberofpoint = 50; [serializefield] list<vector3> pointpositions = new list<vector3>(); charactercontroller chara; [serializefield] transform playertran; [serializefield] float gravity = 3.8f; [serializefield] float jumpforce = 50f; vector3 movevector = vector3.zero; [serializefield] transform jumpcheck; [serializefield] transform jumppos; [serializefield] transform jumphightone; bool movejump; vector3 pzero; vector3 pone; float time; // use initialization void start () { chara = getcomponent<charactercontroller>(); playertran = gameobject.findgameobjectwithtag("player").getcomponent<transform>(); jumpline.positioncount = numberofpoint; jumpline.gameobject.setactive(false); } // update called once per frame void update () { chara.move(movevector); if (chara.isgrounded) { transform.lookat(playertran); } movevector -= vector3.up * gravity * time.deltatime; if (input.getkeyup(keycode.j)) { jumpcheck.position = new vector3(playertran.position.x, 0, playertran.position.z); float angle = findangle( playertran.position.x - transform.position.x , playertran.position.z - transform.position.z); vector3 _tojumppos = makejumpcricle(playertran.position , jumpcheck.localscale.x/2, angle); vector3 middlepoint = getthemiddlepoints(transform.position, playertran.position, 0.5f); jumphightone.position = new vector3(middlepoint.x, jumphightone.position.y, middlepoint.z); jumppos.position = new vector3(_tojumppos.x, 0, _tojumppos.z); //movevector = vector3.up * jumpforce * time.deltatime; //movejump = true; drawlinerbeziercurves(); } if (movejump) { //movetowardstarget(jumppos.position); } } vector3 getthemiddlepoints(vector3 origin, vector3 destination, float middlepointfactor) { return (destination - origin) * middlepointfactor + origin; // (destination - origin) * 0.5f; } float findangle(float x, float y) { float value; value = (float)((mathf.atan2(x, y) / mathf.pi) * 180); if (value < 0) { value += 360; } //debug.log(value); return value; } vector3 makejumpcricle( vector3 center, float radius, float angle) { vector3 pos = vector3.zero; pos.x = center.x - radius * mathf.sin(angle * mathf.deg2rad); pos.y = 0; pos.z = center.z - radius * mathf.cos(angle * mathf.deg2rad); return pos; } void movetowardstarget(vector3 targetpostios) { var offset = targetpostios - transform.position; if (offset.magnitude > .1f) { offset = offset.normalized * 15; chara.move(offset * time.deltatime); } else { movejump = false; } } // line bezier curves vector3 calculatebeziercurvespoints(float t , vector3 p0, vector3 p1 ) { return p0 + t * (p1 - p0); // p = p0 + t(p1 – p0) , 0 < t < 1 } // line bezier curves vector3 calculatebeziercurvespoints(float t, vector3 p0, vector3 p1, vector3 p2) { float u = 1 - t; float uu = u * u; float tt = t * t; vector3 p = uu * p0; p = p + 2 * u * t * p1; p = p + tt * p2; return p; //p = (1-t)^2 p0 + 2 (1-t) t p1 + t^2 p2 , 0 < t < 1 // uu u tt // uu * p0 + 2 * u * t * p1 + tt * p2 } void drawlinerbeziercurves() { if (pointpositions.count > 0) { pointpositions.clear(); jumpline.positioncount = 0; jumpline.positioncount = numberofpoint; } (int = 1; < numberofpoint + 1; i++) { float t = / (float) numberofpoint; if (!jumpline.gameobject.activeinhierarchy) { jumpline.gameobject.setactive(true); } pointpositions.add(calculatebeziercurvespoints(t, transform.position,jumphightone.position, jumppos.position)); jumpline.setposition(i - 1, pointpositions[i - 1]); } }
Comments
Post a Comment